Vuex快速入门之辅助函数(二)

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

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦