vuex语法糖

1,279 阅读1分钟

store.js

 import Vue from "vue";
import Vuex from "vuex";
import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex);
//什么时候用module
//1.状态树结构复杂时,
//2.多人协同开发项目时,避免命名冲突
const moduleA={
    namespaced:true, //开启命名空间
    state:{
        name:"我是moduleA中的name",
        test:"我是moduleA中的test"
    },
    mutations:{
        changeName(state,payload){
            state.name=payload
        },
        changeTest(state,payload){
            state.test=payload
        }
     },
    actions:{}
}
const moduleB={
    namespaced:true,
    state:{
        name:"我是moduleB中的name",
        test:"我是moduleB中的test"
    },
    mutations:{ },
    actions:{ }
}

const state={
    count:100,
    name:"我是根模块"

}
const mutations={
    increment(state,val){
        state.count++
    },
    decrement(state,val){
        state.count-=val
    }
}
const actions={
    asyncCount(context,val){
        setTimeout(()=>{
            context.commit("increment")
        },3000)
        
    }
}
let store = new Vuex.Store({
    modules:{
        moduleA,
        moduleB
    },
    state,
    mutations,
    actions,
    
        
})
export default store;

组件内

<template>
  <div class="home">
                 
      <div>
        <!-- 直接获取 -->
        {{this.$store.state.name}}
        {{this.$store.state.moduleA.name}}
        {{this.$store.state.moduleA.test}}
        {{this.$store.state.moduleB.test}}
        
      </div>
       <!-- 语法糖形式获取 -->
      <div>
        {{vname}}
        {{test1Name}}
        {{test2Name}}
        <button @click="changeName(123)">click</button>
        <button @click="changeTest(456)">click</button>
      </div>
      
  </div>
</template>

<script>
import {mapState,mapGetters,mapMutations,mapActions} from "vuex"
//注意!mapState,mapGetters必须放在computed里面,
//注意!mapMutations,mapActions必须放在methods里面
export default {
  name: 'home',
  data () {
    return {

    }
  },
  computed:{
      ...mapState({
        vname:"name"
      }),
      ...mapState("moduleA",{
        test1Name:"name"
      }),
      ...mapState("moduleB",{
        test2Name:"test"
      })
  },
  methods:{
    decrement(){
      this.$store.commit("decrement",3)
    },
    increment(){
        this.$store.commit("increment");
        this.$store.dispatch("asyncCount")
    },
    ...mapMutations("moduleA",['changeName','changeTest'])
  }
}
</script>

<style scoped>

</style>