首页>>前端>>Vue->vuex怎么使用?

vuex怎么使用?

时间:2023-12-02 本站 点击:0

超详细!Vuex手把手教程

最近在重温vue全家桶,再看一遍感觉记忆更深刻,所以专门记录一下(本文vuex版本为v3.x)。

Vuex是专为Vue.js开发的状态管理模式。它采用集中式存储,管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化(我的理解就是全局变量)。

state

对象类型,类似于实例的 data属性,存放数据

getters

对象类型,类似于实例的计算属性 computed

mutations

对象类型,类似于实例的 methods,但是不能处理异步方法

actions

对象类型,类似于实例的 methods,可以处理异步方法

modules

对象类型,当state内容比较多时,通过该属性分割成小模块,每个模块都拥有自己的 state、mutation、action、getter

存储在 state 中的数据和 Vue 实例中的 data 遵循相同的规则,必须是纯粹的对象。

getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,并且默认接受 state 作为其第一个参数,也可以接受其他 getter 作为第二个参数(如下例)

通过调用 this.$store.commit('xxx') ,调用 mutation 中的方法,更改 store 中的值

新建文件 mutation-types.js ,定义方法名的常量,并导出

在store中

在组件中

注意, Action 提交的是 mutation ,而不是直接变更状态,并且可以包含任意异步操作

或者

Action 接受一个与 store 实例具有相同方法和属性的 context 参数对象,因此你可以调用 context.commit 提交一个 mutation ,或者通过 context.state 和 context.getters 来获取 state 和 getters ,利用 ES6 的解构,可以简化写法。

在vuex中

在组件中使用 async / await 或者 then / catch 处理异步

当应用变得非常复杂时, store 对象就可能变得相当臃肿。这时候可以将 store 分割成模块,每个模块拥有自己的 state 、 mutation 、 action 、 getter 、甚至是嵌套子模块,从上至下进行同样方式的分割。

在store目录下新建 Modules 文件夹,在 Modules 文件夹中新建 modulesA.js , modulesB.js ,如下图

在modulesA.js中写上局部模块的 state 、 mutation 、 action 、 getter ,并导出

然后在 store 的 index.js 中引入,并丢进 modules 对象里

在组件中直接使用

在组件中使用 mapState 映射

在组件中直接使用

在组件中使用 mapState 映射

模块内部的 getter ,接受的参数 state 和 getters 是模块的局部状态对象,而根节点的状态会作为第三个参数 rootState 暴露出来

如果需要带参数

在组件中直接使用

在组件中使用 mapMutations 映射

模块内部的 mutations ,默认接受的第一个参数 state 是模块的局部状态对象

如果需要带参数

在组件中直接使用

在组件中使用 mapActions 映射

或者重命名

对于模块内部的 action ,局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState

默认情况下,模块内部的 action 、 mutation 和 getter 是注册在全局命名空间的,这样使得多个模块能够对同一 mutation 或 action 作出响应。如果希望模块具有更高的封装度和复用性,可以通过给模块添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter 、 action 及 mutation 都会自动根据模块注册的路径调整命名。

先在模块 moduleB.js 中添加 namespaced: true

在 store 的 index.js 中

如果在组件中使用命名空间,需要带上空间名称, mapState , mapGetters , mapMutations , mapActions 用法一样。

如果你希望使用全局的 state 和 getter , rootState 和 rootGetters 会作为第三和第四参数传入 getter ,也会通过 context 对象的属性传入 action 。若需要在全局命名空间内分发 action 或提交 mutation ,将 { root: true } 作为第三参数传给 dispatch 或 commit 即可

在带命名空间的模块注册全局 action ,需要添加 root: true ,并将这个 action 的定义放在函数 handler 中,其中,handler的第一个参数 namespacedContext 就是 action 中的 Context 参数

如果看了觉得有帮助的,我是@ 鹏多多11997110103 ,欢迎 点赞 关注 评论;

END

往期文章

个人主页

vuex的使用

vuex适合用于多组件共享数据的情况,多个组件都能读,也都可以改。

vuex的执行流程:

安装

使用

vuex是一个插件,所以需要Vue.use

注册了vuex,我们就可以在vue里配置store了

getters

这里多了个配置 getters ,他可以看作是基于state的computed属性。使用的方式基本如下:

同时getters还可以配置成函数,方便我们动态传参,满足一些复杂一点的场景

调用

模块化store

随着项目迭代,需求的扩展,你的store会变得越来越臃肿,建议模块化拆分store

以上就是一些对象的拼装,但是模块要放到名为modules的属性内部,store的最终结构大致如下:

模块的命名空间

默认模块的state、getter等属性都会合并到根级别,如果你希望模块有更好的封装性,避免多模块命名污染,可以配置上命名空间属性namespace:true

使用了模块命名空间后,action和getter内部常规用法只能访问本命名空间的dispatch,commit或者getter,如果要访问全局命名空间,需要使用额外的参数和配置:

模块动态注册

在 store 创建之后,你可以使用 $store.registerModule 方法注册模块

如果大多场景下,你的模块化store并不会被使用,只在你的业务流程页面中被用到,这时可以考虑在合适的生命周期节点(比如created)动态注册你的模块。同时要注意先检查模块是否已经被安装: $store.hasModule(moduleName) ,避免重复注册模块,不然会出现逻辑问题。你也可以卸载自己的模块: $store.unregisterModule(moduleName)

官方文档

Vuex简单使用

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

如果一份数据需要在多个组件中使用,组件间传值又比较复杂,就可以使用vuex托管数据。

state选项: 定义状态(状态就是数据)。

mutations选项: 定义修改状态的方法(注意:这里面只能定义同步方法)。

$store: 返回的是当前项目中的全局状态对象。

commit()方法: 用于执行指定的mutations里面的方法。

在组件中,直接通过$store.state就可以获取到全局状态对象管理的状态数据,直接渲染到页面。

state选项: 定义状态(状态就是数据)。

通过 $store.state.数据名 使用。

getters选项: 定义计算属性。方法的参数是状态对象。

通过 $store.getters.属性名 使用计算属性。

mutations选项: 定义修改状态的方法(注意:这里的方法一般都是同步方法)。方法的第一个参数是状态对象,第二个参数是新值。

通过 commit() 方法,调用mutations里面的方法。

actions选项: 定义操作状态的方法(这里的方法可以定义异步方法)。

注意: actions里的方法最好不要直接操作state状态,而是通过调用mutations里面的方法去修改状态。所以,actions直接操作的是mutations。

通过 dispatch() 方法,调用actions里面定义的方法。

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。

namespaced属性: 默认情况下,action、mutation 和 getter 是注册在全局命名空间的。通过设置namespaced属性为true,将action、mutation 和 getter全部注册到私有命名空间中。

要从私有模块中获取数据,方式是: $store.state.模块名称.模块的数据 。

要从私有模块中获取计算属性,方式是: $store.getters['模块名/计算属性'] 。

调用私有模块里面的mutations定义的方法,方式是: $store.commit('模块名/方法名',新值) 。

调用私有模块里面的actions定义的方法,方式是: $store.dispatch('模块名/方法名',新值) 。

直接在模板中使用全局状态管理数据,表达式会写的很长。所以可以使用计算属性。

通过映射函数mapState、mapGetters、mapActions、mapMutations,可以将vuex.store中的属性映射到vue实例身上,这样在vue实例中就能访问vuex.store中的属性了,便于操作vuex.store。

如果vuex里面state的数据名称 跟 页面中的计算属性名称相同,就可以使用 mapState 映射函数,自动生成页面中的计算属性。

如果vuex里面getters的数据名称 跟 页面中的计算属性名称相同,就可以使用 mapGetters 映射函数,自动生成页面中的计算属性。

注意: 如果要映射模块里面的state/getters,函数的第一个参数设置为模块的名称。

如果定义的方法名跟全局管理对象中mutations里面的方法名相同,并且定义的方法会带有一个参数,通过参数传递数据。满足该规则,就可以使用 mapMutations 映射函数生成方法。

如果定义的方法名跟全局管理对象中actions里面的方法名相同,并且定义的方法会带有一个参数,通过参数传递数据。满足该规则,就可以使用 mapActions 映射函数生成方法。

注意: 如果要映射私有模块中mutations/actions里面的方法,函数的第一个参数设置为模块的名称。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Vue/9332.html