Vue-55、Vue技术vuex模块化

一、代码

1、store.js

//改文件用于创建最为核心的store
//引入vue
import Vue from "vue";
//引入vuex
import Vuex from 'vuex';

//求和功能相关的配置
const  countOptions={
    namespaced:true,
    actions:{
        jia:function (context,value) {
            console.log('action中的jia被调用了',context,value);
            context.commit('JIA',value)
        },

        jiaWait:function(context,value){
            console.log('action中的jia被调用了',context,value);
            context.commit('JIAWAIT',value)
        },

        jian:function (context,value) {
            context.commit('JIAN',value);
        },

        SumOdd:function (context,value) {
            context.commit('SUMODD',value)
        },
    },
    mutations:{
        JIA(state,value){
            console.log('mutation中的JIA被调用了',state,value);
            state.sum += value;
        },
        JIAN(state,value){
            state.sum -= value;
        },
        SUMODD(state,value){
            if (state.sum % 2){
                state.sum += value;
            }
        },
        JIAWAIT(state,value){
            setTimeout(()=>{
                state.sum += value;
            },500)
        },
    },
    state:{
        sum:0, //当前的和
        school:'清华',
        subject:'技术',
    },
    getters:{
        bigSum(state){
            return state.sum*10;
        },
    },
};
//人员管理相关配置
const  personOptions={
    namespaced:true,
    actions:{
        addPersonWang(context,value){
            if (value.name.indexOf('王')===0) {
                context.commit('ADD_PERSON',value);
            }else {
                alert("添加的人不姓王")
            }
        }
    },
    mutations:{
        ADD_PERSON(state,value){
            state.personList.unshift(value);
        }
    },
    state:{
        personList:[
            {id:'001',name:'张三'}
        ]
    },
    getters:{
        personNum(state){
            return state.personList.length
        },
        firstPersonName(state){
            return state.personList[0].name
        }
    },
};
//使用
Vue.use(Vuex);
//创建store
const store = new Vuex.Store({
    modules:{
        countOptions,
        personOptions
    }
});
//暴露store
export default store;

2、Count.vue

<template>
    <div >
        <h1>当前求和为:{{sum}}</h1>
        <h1>当前求和放大10倍为:{{bigSum}}</h1>
        <h3>我在{{school}},学习{{subject}}</h3>
        <select v-model.number="number">
            <option value="1">1</option>
            <option value="2">2</option>
            <option  value="3">3</option>
        </select><br>
        <button @click="addSum(number)">+</button>
        <button @click="reduceSum(number)">-</button>
        <button @click="addSumOdd(number)">当前和为奇数再加</button>
        <button @click="addSumWait(number)">等等在加</button>
        <h1>下方组件人员数量{{personNum}}</h1>
    </div>
</template>
<script>
    import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
    export default {
        name: "Count",
        data(){
            return{
                number:1,
            }
        },
        computed:{
            ...mapState('countOptions',['sum','school','subject']),
            ...mapGetters('countOptions',['bigSum']),
            ...mapGetters('personOptions',['personNum']),
        },
        methods:{
            ...mapMutations('countOptions',{addSum:'JIA',reduceSum:'JIAN'}),
            ...mapActions('countOptions',{addSumOdd:'SumOdd',addSumWait:'jiaWait'})
        },
    }
</script>
<style scoped>
   button{
       margin-left: 5px;
   }
</style>

3、Person.vue

<template>
    <div>
        <h1>上方组件的和为:{{sum}}</h1>
        <h1>人员列表</h1>
        <h3>列表中第一个人的名字是:{{firstPersonName}}</h3>
        <input type="text" placeholder="请输入名字" v-model="personName">
        <button  @click="addPerson">添加</button>

        <button  @click="addPersonWang">添加一个姓王的人</button>
        <ul>
            <li v-for="p in personList" :key="p.id">{{p.name}}</li>
        </ul>
    </div>
</template>
<script>

    import {mapState,mapMutations} from 'vuex';
    import  {nanoid}  from 'nanoid';
    export default {
        name: "Person",
        data(){
            return{
                personName:'',
            }
        },
        computed:{
            ...mapState('countOptions',['sum']),
            ...mapState('personOptions',['personList']),
            firstPersonName(){
                return this.$store.getters['personOptions/firstPersonName']
            }
        },
        methods:{
            // ...mapMutations({addPerson:'ADD_PERSON'})
            addPerson(){
                if (this.personName.trim()=='') {
                    alert('输入不能为空');
                }else {
                    this.$store.commit('personOptions/ADD_PERSON',{id:nanoid(),name:this.personName.trim()});
                    this.personName = '';
                }
            },

            addPersonWang(){
                this.$store.dispatch('personOptions/addPersonWang',{id:nanoid(),name:this.personName});
                this.personName = '';
            }
        }
    }
</script>

<style scoped>

</style>

二、总结
1、目的:让代码更好维护,让多种分类更加明确

2、修改store.js

const  countOptions={
    namespaced:true,
    actions:{
        ......
    },
    mutations:{
        ......
    },
    state:{
        sum:0, //当前的和
        school:'清华',
        subject:'技术',
    },
    getters:{
        bigSum(state){
            return state.sum*10;
        },
    },
};

const  personOptions={
    namespaced:true,
    actions:{
        ......
    },
    mutations:{
        ......
    },
    state:{
        personList:[
            {id:'001',name:'张三'}
        ]
    },
    getters:{
        personNum(state){
            return state.personList.length
        },
        firstPersonName(state){
            return state.personList[0].name
        }
    },
};
//使用
Vue.use(Vuex);
//创建store
const store = new Vuex.Store({
    modules:{
        countOptions,
        personOptions
    }
});
//暴露store
export default store;

3、开启命名空间后,组件中读取state数据

//方式一:自己读取
this.$store,state.personOptions.personList
//方式二:借助mapState读取
...mapState('countOptions',['sum','school','subject']),

4、开启命名空间后,组件中读取getters数据:

//方式一:自己读取
this.$store.getters['personOptions/firstPersonName']
//方式二:借助mapGetters读取
...mapGetters('countOptions',['bigSum']),

5、开启命名空间后,组件中调用dispatch

//方式一:自己调用
this.$store.dispatch('personOptions/addPersonWang',{id:nanoid(),name:this.personName});
//方式二:借助mapActions读取
 ...mapActions('countOptions',{addSumOdd:'SumOdd',addSumWait:'jiaWait'})

6、开启命名空间后,组件中调用commit

//方式一:自己调用
this.$store.commit('personOptions/ADD_PERSON',{id:nanoid(),name:this.personName.trim()});
//方式二:借助mapMutations读取
...mapMutations('countOptions',{addSum:'JIA',reduceSum:'JIAN'}),
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶飘零晋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值