1.vuex概念
专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件。
对 vue 应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信
2.vuex工作原理图
整个虚线部分就是Vuex,我们可以把它看成一个公共仓库store。store中有Actions(行为)、Mutations(变动)和State(状态)。整个的逻辑是组件通过Dispatch
调用Actions中的方法,Actions通过Commit调用Mutations中的方法,Mutatisons改变State中的值。
3.vuex构造
actions
由子组件this.$store.dispatch('actions名',传递的数据)触发,传递的数据只能是单个数据,多个数据用对象传递
actions: { action名({commit},数据){...}}
store中actions内,commit用于触发mutations,actions只做业务逻辑,不修改state
mutations
由actions中的commit('mutations名',传递的数据)触发,只有mutations可以修改state中的数据
mutations:{mutations名(state,数据){...}}
state
存储数据:state:{userInfor:{}}
可以通过mutations存储或者修改,也是getters里面计算属性的依据
getters
计算state中的数据:getters:{getters名(state){...}}
4.vuex的常规用法(不使用模块(module)的store)
(1)创建store
(2)在组件中使用
*** mapState和mapGetters的两种写法
5.vuex模块式开发
由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的state、mutations、actions、getters、甚至是嵌套子模块。
5.1vuex中模块的基础使用(不开启命名空间时)
默认情况下,模块内部的 actions、mutations 和 getters 是注册在全局命名空间的——这样使得多个模块能够对同一 mutations 或 actions 作出响应。
对于actions、mutations 和 getters,是在模块中还是在全局中,它们的使用方式是相同的,只是state会有所不同,模块中的state会多一层模块名。格式变成
store.state.模块名.状态名
(1)store模块
创建一个带模块的根store
(2)store子模块
主题模块(store/modules/theme.js)内容
产品模块(store/modules/product.js)内容,类似于主题模块
(3)在组件中使用
5.2vuex中模块的基础使用(开启命名空间namespaced时)
如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getters、actions 及 mutations 都会
自动根据模块注册的路径调整命名。所以开启命名空间的模块中的getters、actions 和 mutations的使用方式都会改变;但是开启命名空间和不开启命名空间的模块中的state的使用方式
不会改变。格式依然是store.state.模块名.状态名
开启store子模块的命名空间
在组件中使用