Vuex 状态管理器

vuex:状态管理器,多个组件可共用数据

有四个属性,都是对象结构

    Vue.use(Vuex);//调用vuex内部的install方法,把定义的store存在$store中,使每个组件都能通过$store调用到对应的属性和方法
export default new Vuex.Store({
    state:{
        a:1,//通过$store.state.a获取
        b:2
    },
    getters:{ //相当于computed属性,通过$store.getters.getterName()调用
        getterName(state){//参数是state
            return state+1
        }
    },
    mutations:{
        addAge(state,payload){ //通过commit来调用——this.$store.commit("addAge",10);第一个参数是mutations的名称,第二个参数是传递的载荷,可以是一个对象
          state.age += payload;
        }
    },
    actions:{//通过dispatch来调用
        addAgeAsync({commit},payload){
          commit("addAge",payload);
        }
    },
    modules:{
        
    }
});

若mutations内部的方法名重名,则会执行最后面的那个方法

如果是modules里面的mutations和根模块的mutations重名,则会依次执行

export default new Vuex.Store({
  modules:{
    a:{
      mutations:{
        addAge(state,payload){
          console.log("sss");
        }
      },
    }
  },
  state:{
    age:18
  },
  mutations:{
    addAge(state,payload){
      state.age += payload;
      console.log("sss1");
    },
    addAge(state,payload){
      state.age+=1;
      console.log("sss2");//只会执行后面的这个方法
    },
  }
})
//先输出sss2,再输出sss

Store的内部结构

如果有同名的方法,但是我掉这个方法的时候我只想执行某个模块下面的方法,可以给这个模块添加个命名空间namespaced:true

module A.js
export default {
    namespaced:true,//命名空间
    mutations:{
        fun1(){
            console.log("A模块");
        }
    }

}


module B.js
export default {
    namespaced:true,//命名空间
    mutations:{
        fun1(){
            console.log("B模块");
        }
    }

}


//调用
this.$store.commit("A/fun1");//A模块

vuex的辅助函数:mapActions,mapMutations,mapState

以mapActions作为例子

import {mapActions} from 'vuex'

//在有模块的情况下(还是用前面的A,B模块作为例子),调用mapActions都要在前面加上模块的名称,比较繁琐
import {createNamespacedHelpers} from 'vuex' //vuex提供的命名空间辅助函数
let {mapActions} = createNamespacedHelpers("home");//这样就可以直接调用mapActions(['fun2']),而不用在加上命名空间了

export default {
  mounted(){
    //直接把模块中actions的方法添加到组件实例中,可以用this来调用
    this.setCategory();
   
  },
  methods:{
    //mapActions(['fun2'])返回来的是一个对象,要用扩展运算符展开
    ...mapActions('A',['fun2'])//有命名空间的写法,多个actions。mapActions(['fun2','fun3'])
  }
}

PS:如果模块加了命名空间,则一定要用模块名来调用,否则无法调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值