在 Vuex 初体验中我们介绍了 Vuex 的基本使用方法。而一些特殊的写法以及使用方式我们还是得老老实实的刷一遍官方文档。
State
state就是状态数据,而 Vuex 管理的就是状态,其他的Actions、Mutations等都是辅助实现对状态的管理的。我们可以通过this.$store.state直接获取状态,
通常我们通过mapState函数将引入的state放至computed属性之中,使得其在有缓存的情况下保持动态更新。
mapState
当一个组件需要获取多个状态的时候,将其都声明为计算属性会有些重复和冗余,所以我们可以使用mapState辅助函数帮助我们生成计算属性
1 | // 在单独构建的版本中辅助函数为 Vuex.mapState |
若映射的计算属性的名称与state的子节点名称相同时,亦可给mapState传一个字符串数组
1 | computed: mapState([ |
Getters
这东西基本是用于取数据,但是不一样的是我们可以使用它给取到的state进行处理,可以理解为一个filter。同样的,它有些类似 vue 中的computed属性,一旦依赖发生改变则会被重新计算,否则使用缓存。
我们可以通过this.$store.getters.valueName对派生出来的状态进行访问,或者直接使用mapGetters将其映射到computed中
mapGetters
1 | import { mapGetters } from 'vuex' |
若是希望在调用处重新起名则可以使用对象形式
1 | mapGetters({ |
Mutations
Mutations译为“变化”。顾名思义,务必通过提交(commit)mutation来出发状态的更新。双方约定一个事件名,并通过载荷(payload)完成参数的传递
我们在mutations中定义改变state中数据的方法
1 | mutations: { //放置mutations方法 |
我们可以通过commit提交相应的mutation
1 | this.$store.commit('increment', { |
mapMutations
除此了使用this.$store.comit('eventName')的方式提交之外,还有另外一种方式:使用mapMutations辅助函数将数组中的methods映射为this.$store.commit:
1 | import { mapMutations } from 'vuex' |
如此,通过类似于事件处理函数(handler)和事件触发(emit)之间的关系,即可以完成mutations的操作
mutation-types
考虑到触发的mutation的type必须与mutations里声明的mutation名称一致,比较好的方式是把这些mutation都集中到一个文件(如mutation-types)中以常量的形式定义,在其它地方再将这个文件引入,便于管理。而且这样做还有一个好处,就是整个应用中一共有哪些mutation type可以一目了然。就像下面这样:
1 | // mutation-types.js |
Ps:
mutation必须是同步函数,其目的是使得dev-tools可以捕捉到每一条mutation的前后状态的快照原作者贴了相关帖子的链接,我也沾一下吧:知乎传送门
Actions
Actions按照我个人的理解就是用于处理逻辑代码。我们将操作数据的方法定义在Mutations中,将逻辑部分放置在Actions中。可以理解为:action处理函数所作的事情就是commit mutation。
更棒的是Actions可以包含异步操作。
其接受的参数如下
context:与store实例具有相同方法和属性。我们可以调用context.commit提交一个mutation或者通过context.state和context.getters获取state和getters
触发action
我们可以通过dispatch触发action方法。当然触发方式也有两种,大家挑个顺眼的用就行。
1 | // 载荷形式分发 |
mapActions
1 | import { mapActions } from 'vuex' |
异步操作
另外,this.$store.dispatch可以处理被触发的action的处理函数返回的Promise,且this.$store.dispatch仍旧返回Promise
1 | // 所以诸如此类的异步操作... |
同样的我们可以使用 ES6 新型的 API
1 | // 假设 getData() 和 getOtherData() 返回的是 Promise |
我们来举个例子,看一个更加实际的购物车示例,涉及到调用异步 API 和分发多重 mutation:
1 | actions: { |