在 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: { |