mapState mapGetters

这篇博客介绍了Vuex中用于管理状态的四个辅助函数:mapState用于将state数据映射为计算属性,mapGetters用于映射getters数据,mapActions帮助创建与actions交互的方法,而mapMutations则用于生成与mutations交互的函数。在使用mapActions和mapMutations时,如果需要传递参数,需在模板中绑定事件并传递。

1. mapState方法:用于帮助我们映射state中的数据为计算属性

computed:

//借助mapState生成计算属性: sum、 school、 subject (对象写法)

        ... mapState({sum: 'sum' ,school: 'school' ,subject:'subject'}),

        //借助mapState生成计算属性: sum、 school、 subject (数组写法)

        ...mapState(['sum' ,' school','subject']),

        },

2. mapGetters方法: 用于帮助我们映射getters中的数据为计算属性

        computed:       

//借助mapGetters生成计算属性: bigSum (对象写法)

        ...mapGetters( {bigSum: 'bigSum'}),

        //借助mapGetters生成计算属性: bigSum (数组写法)

        ... mapGetters(['bigSum' ])

        },

index.js

// 该文件用于创建Vuex中最为核心的store
// 引入Vue
import Vue from 'vue'
//引入Vuex 
import Vuex from 'vuex'
// 应用Vuex插件
Vue.use(Vuex)

// 准备actions--用于响应组件中的动作
const actions = {
    /* jia:function(context,value){
        console.log('actions中的jia被调用',context,value);
        context.commit('JIA',value)
    },
    jian:function(context,value){
        console.log('actions中的jian被调用',context,value);
        context.commit('JIAN',value)
    }, */
    jiaOdd:function(context,value){
        console.log('actions中的jiaOdd被调用',context,value);
        if (context.state.sum % 2) {
            context.commit('JIA',value)
        }
    },
    jiaWait:function(context,value){
        console.log('actions中的jiaWait被调用',context,value);
        setTimeout(()=>{
            context.commit('JIA',value)
        },500)
    },
}
// 准备mutations--用于操作数据(state)
const mutations = {
    JIA(state,value){
        // console.log('mutations中的JIA被调用了',state,value);
        state.sum += value
    },
    JIAN(state,value){
        // console.log('mutations中的JIAN被调用了',state,value);
        state.sum -= value
    }
}
// 准备state--用于存储数据
const state = {
    sum:0,//当前的和
    school:'尚硅谷',
    subject:'前端'
}
// 准备getters--用于将state中的数据进行加工
const getters = {
    bigSum(state){
        return state.sum*10
    }
}

// 创建store
const store = new Vuex.Store({
    // 对象中的key和保存对应值的变量重名,可以简写
    actions:actions,
    mutations,
    state,
    getters
})

// 暴露store
export default store

/* 
    等同于
    export default new Vuex.Store({

    })
*/

count.vue

<template>
    <div>
        <h1>当前求和为:{{sum}}</h1>
        <h1>当前求和放大10倍为:{{bigSum}}</h1>
        <h3>我在{{school}},学习{{subject}}</h3>
        <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>
        <button @click="increment">+</button>
        <button @click="decrement">-</button>
        <button @click="incrementOdd">当前求和为奇数再加</button>
        <button @click="incrementWait">等一等再加</button>
    </div>
</template>

<script>
    import {mapState,mapGetters} from 'vuex'
    export default {
        name:'Count',
        data(){
            return {
                n:1,//用户选择的数字
            }
        },
        computed:{
            // 靠程序员自己亲自去写计算属性
            /* sum(){
                return this.$store.state.sum
            },
            
            school(){
                return this.$store.state.school
            },
            subject(){
                return this.$store.state.subject
            }, */

            // 借助mapState生成计算属性,从state中读取数据(对象写法)
            // ...mapState({'he':'sum',xuexiao:'school',xueke:'subject'}),
            
            // 借助mapState生成计算属性,从state中读取数据(数组写法)
            ...mapState(['sum','school','subject']),


            /* *********************************************** */

            /* bigSum(){
                return this.$store.state.bigSum
            }, */

            // 借助mapGetters生成计算属性,从getters中读取数据(对象写法)
            // ...mapGetters({bigSum:'bigSum'})

            // 借助mapGetters生成计算属性,从getters中读取数据(数组写法)
            ...mapGetters(['bigSum'])

        },
        methods: {
            increment(){
                this.$store.commit('JIA',this.n)
            },
            decrement(){
                this.$store.commit('JIAN',this.n)
            },
            incrementOdd(){
                this.$store.dispatch('jiaOdd',this.n)
            },
            incrementWait(){
                this.$store.dispatch('jiaWait',this.n)
            },
        },
        mounted() {
            // console.log('Count',this.$store)
            const x = mapState({'he':'sum',xuexiao:'school',xueke:'subject'})
            console.log(x);
        },
    }
</script>

3. mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数

       

methods:{
            //靠mapActions生成: incrementOdd、 incrementWait (对象形式)
            ...mapActions({incrementOdd: 'jiaOdd' , incrementWait:'jiawait'})

            //靠mapActions生成: incrementodd、 incrementWait (数组形式)
            ... mapActions(['jiaOdd', jiaWait'])
        }

4. mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数

       

methods:{
            //靠mapActions生成: increment、 decrement (对象形式)
            ...mapMutations({increment:'JIA', decrement: 'JIAN'}),
            
            //靠mapMutations生成: JIA、 JIAN (对象形式)
            ...mapMutations(['JIA','JIAN']),
        }

    备注: mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。

Count.vue

<template>
    <div>
        <h1>当前求和为:{{sum}}</h1>
        <h1>当前求和放大10倍为:{{bigSum}}</h1>
        <h3>我在{{school}},学习{{subject}}</h3>
        <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>
        <button @click="increment(n)">+</button>
        <button @click="decrement(n)">-</button>
        <button @click="incrementOdd(n)">当前求和为奇数再加</button>
        <button @click="incrementWait(n)">等一等再加</button>
    </div>
</template>

<script>
    import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
    export default {
        name:'Count',
        data(){
            return {
                n:1,//用户选择的数字
            }
        },
        computed:{

            // 借助mapState生成计算属性,从state中读取数据(对象写法)
            // ...mapState({'he':'sum',xuexiao:'school',xueke:'subject'}),
            
            // 借助mapState生成计算属性,从state中读取数据(数组写法)
            ...mapState(['sum','school','subject']),


            /* *********************************************** */


            // 借助mapGetters生成计算属性,从getters中读取数据(对象写法)
            // ...mapGetters({bigSum:'bigSum'})

            // 借助mapGetters生成计算属性,从getters中读取数据(数组写法)
            ...mapGetters(['bigSum'])

        },
        methods: {
            // 程序员亲自写方法
            /* increment(){
                this.$store.commit('JIA',this.n)
            },
            decrement(){
                this.$store.commit('JIAN',this.n)
            }, */

            // 借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)
            ...mapMutations({increment:'JIA',decrement:'JIAN'}),

            // 借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(数组写法)
            // ...mapMutations(['JIA','JIAN']),
            // 使用数组写法要记得将上方点击事件名字换成JIA JIAN

            /* ***************************************** */

            /* incrementOdd(){
                this.$store.dispatch('jiaOdd',this.n)
            },
            incrementWait(){
                this.$store.dispatch('jiaWait',this.n)
            }, */

            // 借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
            ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
            

            // 借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(数组写法)
            // ...mapActions(['jiaOdd','jiaWait'])
            // 使用数组写法要记得改上方点击事件名字  jiaOdd jiaWait
        },
        mounted() {
            // console.log('Count',this.$store)
            const x = mapState({'he':'sum',xuexiao:'school',xueke:'subject'})
            console.log(x);
        },
    }
</script>

<style>
    button{
        margin-left: 5px;
    }
</style>

mapStatemapGetters是Vue.js中用于将state和getters映射到组件的计算属性的辅助函数。 mapState函数可以将store中的state映射到组件的计算属性中。它接收一个数组或对象作为参数,数组中的元素可以是state中的属性名,或者是一个包含属性名和对应getter的对象。使用mapState后,在组件中就可以直接访问这些计算属性,而不需要在模板中使用this.$store.state来访问。 例如,如果有一个名为count的state属性,可以使用以下方式将其映射到组件的计算属性: ``` import { mapState } from 'vuex' export default { computed: { ...mapState(['count']) } } ``` 这样,在模板中就可以直接使用{{ count }}来访问这个计算属性。 mapGetters函数用于将store中的getters映射到组件的计算属性中。它接收一个数组或对象作为参数,数组中的元素可以是getter函数名,或者是一个包含getter函数名和对应的计算属性名的对象。类似地,使用mapGetters后,在组件中就可以直接访问这些计算属性。 例如,如果有一个名为doubleCount的getter函数,可以使用以下方式将其映射到组件的计算属性: ``` import { mapGetters } from 'vuex' export default { computed: { ...mapGetters(['doubleCount']) } } ``` 这样,在模板中就可以直接使用{{ doubleCount }}来访问这个计算属性。 通过使用这两个辅助函数,可以简化组件中访问state和getters的代码,使代码更加清晰和易读。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值