作为一枚有上进心的程序员,都喜欢有逼格的优雅的代码,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;
 
        
         
      
                
                
