vuex是什么?
vuex 是 Vue 配套的 公共数据管理工具,它可以把一些共享的数据,保存到 vuex 中,方便整个程序中的任何组件直接获取或修改我们的公共数据。
注意点: 只有需要共享的才放到vuex上, 不需要共享的数据依然放到组件自身的data上。
State
State仓库,vuex使用单一状态树,每一个应用最好仅包含一个store实例,不建议直接修改state的值,最好是通过commit方法调用mutation任务进行修改,方便后期数据的追踪;
主要特点:
- 一个页面只能有一个state
- 状态存储是响应式的
- 不能直接改变 state 中的状态,唯一途径显式地提交mutations
Getter
你可以理解它是一个状态计算属性,好比组件里面的computed属性,所以getter 的返回值也会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,说白了就是对 store 中的 state 做了一层封装,getter 可以接受两个参数,第一个是状态state,第二个参数是其他getter !
Mutation
Mutations,定义方法动态修改state中的数据,不建议包含逻辑业务处理,处理一些同步任务;
更改 Vuex 的 state 中的状态的唯一方法是提交 mutation。回调函数可以接受两个参数,第一个参数是state状态,第二个参数是 mutation 的载荷就是外面store.commit 传入额外的参数。
Actions
Actions,定义方法执行异步任务一些复杂的逻辑代码,view层通过store.dispath分发Action任务;
主要特点:
- Action 提交的是 mutation,而不是直接变更状态。
- Action 可以包含任意异步操作。
Module
Module,项目特别复杂的时候使用,每一个模块拥有自己的state,mutation,Action,getter,代码逻辑更加清晰;
模块的命名空间
如果把所有的状态都放在一个 store 对象里面,当应用变得非常复杂时,store对象就有可能变得相当臃肿,维护起来也会变得相当复杂,所以我们可以用模块来划分。比如A module,B module, 在项目中很有可能Amodule内部的 action、mutation 和 getter 可能和B module内部的 action、mutation 和getter方法名定义一样,但是这些方法又都是全局的,那么假如提交一次 mutation,A module 和 B module 的mutation 都会执行,这肯定不行,所以可以用模块的命名空间来区分,可以通过添加 namespaced: true的方式使其成为带命名空间的模块。