作为一枚有上进心的程序员,都喜欢有逼格的优雅的代码,Vuex 也提供了这么一个骚操作,那就是辅助函数。
Vuex 中的 State, Getters, Mutations, Actions 辅助函数分别对应 mapState
, mapGetters
, mapMutations
, mapActions
Vuex官网中辅助函数的介绍
1.mapState 辅助函数
当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:
// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'
export default {
// ...
computed: mapState({
// 箭头函数可使代码更简练
count: state => state.count,
// 传字符串参数 'count' 等同于 `state => state.count`
countAlias: 'count',
// 为了能够使用 `this` 获取局部状态,必须使用常规函数
countPlusLocalState (state) {
return state.count + this.localCount
}
})
}
当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。
computed: mapState([
// 映射 this.count 为 store.state.count
'count'
])
对象展开运算符
mapState 函数返回的是一个对象。我们如何将它与局部计算属性混合使用呢?通常,我们需要使用一个工具函数将多个对象合并为一个,以使我们可以将最终对象传给 computed 属性。但是自从有了对象展开运算符(现处于 ECMASCript 提案 stage-3 阶段),我们可以极大地简化写法:
computed: {
localComputed () { /* ... */ },
// 使用对象展开运算符将此对象混入到外部对象中
...mapState({
// ...
})
}
2.mapGetters 辅助函数( mapMutations, mapActions 也是这种写法)
mapGetters 辅助函数仅仅是将 store 中的 getters 映射到局部计算属性:
import { mapGetters } from 'vuex'
export default {
computed: {
// 使用对象展开运算符将 getters 混入 computed 对象中
...mapGetters([
'doneTodosCount',
'anotherGetter',
// ...
])
}
}
如果你想将一个 getter 属性另取一个名字,使用对象形式:
mapGetters({
// 映射 this.doneCount 为 store.getters.doneTodosCount
doneCount: 'doneTodosCount'
})
简单的计数器案例
效果预览: VuexTest 辅助函数;
git项目地址
count2.vue文件内容如下
<template>
<div class="count">
<p>辅助函数用法</p>
<p></p>
<p>
<button @click="add">+</button>
<button @click="sub">-</button>
</p>
<hr/>
<p>计数器1 的值:{\{ count }}</p>
</div>
</template>
<script>
`
import {mapState, mapGetters, mapMutations } from 'vuex'
export default {
data(){
return{
}
},
methods: {
...mapMutations({ // mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用
addClick: "ADD_ITEM", // 映射 this.addClick() 为 this.$store.commit('ADD_ITEM')
subClick: "SUB_ITEM" // 映射 this.subClick() 为 this.$store.commit('SUB_ITEM')
}),
add(){
this.addClick(100)
},
sub(){
this.subClick(100)
}
},
computed: {
...mapGetters(['num']), //mapGetters 辅助函数仅仅是将 store 中的 getters 映射到计算属性
...mapState(['count']), //mapState 辅助函数将 state 映射到计算属性中去
//或者 可以用 对象写法 获取
// ...mapGetters({
// num: 'num'
// }),
// ...mapState({
// count: state => state.count
// })
},
}
`
</script>
/store/index.js 文件如下
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state = {
count: 0,
num:0,
};
const mutations = {
// increment: state => state.count++,
// decrement: state => state.count--,
ADD_ITEM: (state, num) => state.num += num,
SUB_ITEM: (state, num) => state.num -= num,
};
const actions = {};
const getters = {
num: state => state.num
}
const store = new Vuex.Store({
state,
getters,
actions,
mutations
})
export default store;