Vuex4
一、概述
- 是什么:
- 一个专为vue.js应用程序开发的状态管理模式+库(就是一个数据状态管理仓库)
- 干什么:
- 采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
- 适用场景:
- 多个组件需要共享状态时
- 注意:这时如果采用传参会非常繁琐,还不如把组件的共享状态抽取出来,以一个全局单例模式管理
二、怎么用:
- 安装:
- npm install vuex@next --save/yarn add vuex@next --save
- 构建Store并安装(Vuex应用的核心,一个Vue应用只能有一个store实例)
- Store是什么:
- 构建方式:
- 数据较多时,建议采取模块化
- 模块化指:
- 将数据按照功能进行模块划分,使得每个模块都拥有各自的独立空间,便于数据管理
- 具体做法(一种示例):
- 在src/store文件夹下新建modules文件夹,下面存放各个模块的相关文件(.js)
- 关于模块文件:
- mutation,getter接收的第一个参数为模块的局部状态对象
- action里,局部状态通过'context.state'暴露出来,根节点状态为'context.rootState'
- getter里,根节点状态会作为第三个参数暴露出来
- action,mutation,getter注册在全局命名空间
- 创建vuex对象(我采取了模块化)
- 在src/store文件夹下新建index.js文件
- 使用createStore()来创建vuex对象/store实例
- 引入模块:
- createStore({modules:{模块化文件其名称1,名称2...})
- 安装store实例:
- 应用实例名.use(store实例名)
- vuex通过vue的插件系统将store实例从根组件中“注入”到所有的子组件里
- 子组件能通过this.$store访问到
- 每个模块化文件该如何书写:
- 使用export导出state,getters,mutations,actions
- 如何解决模块化空间问题(比如:不同模块化文件里出现相同名称)
- export导出namespaced:true表示该属性将模块限定到命名空间下
三、vuex里的核心概念
- State:
- 干什么:
- 存储数据,存储后组件可通过state对象直接获取数据,如果使用模块化的话,还得加上模块名访问
- 展示状态:
- mapState辅助函数:
- Getters:
- 用途:
- 用于获取State对象的数据,对其进行计算返回新的结果而不改变State对象里的原始数据
- 接收参数:
- 访问方式:
- mapGetters辅助函数:
- Mutations:
- 用途:
- 包含:
- 一个字符串类型的事件类型(type)
- 一个回调函数(handler)
- 是什么:
- 接收参数:
- 如何唤醒mutation处理函数:
- 第一种方式:store.commit('回调函数名',提交载荷)
- 第二种方式:store.commit(提交载荷)
- 此方式里的提交载荷要有type="回调函数名"字段
- 提交载荷:
- mutation必须是同步函数:
- 每一条mutation被记录,devtools都需要捕捉到前一状态和后一状态的快照,而mutataion如果是异步,devtools无法捕获到后一状态的快照,因为不知道回调什么时候执行
- mapMutations辅助函数:
- 将组件中的methods映射为
store.commit调用
- Action:
- 用途:
- 接收传参:
- 与store实例具有相同方法与属性的context对象
- 如何触发action:
- 如何提交mutation:
- 如何在组件里使用action来触发状态管理库的更新
- 第一种方式:dispatch()
- store.dispatch:
- 能处理被触发的action的处理函数返回的Promise,并且
store.dispatch仍旧返回 Promise
- 第二种方式:mapAction()将组件的methods映射为store.dispatch调用
- 使用好处:
- 不同于不能使用异步的mutation,action可以使用异步