15.Vuex使用

vuex官網(wǎng)API https://vuex.vuejs.org/zh-cn/
vuex其實(shí)就是數(shù)據(jù)倉(cāng)庫(kù),用來(lái)管理數(shù)據(jù),適用于大中型項(xiàng)目,當(dāng)組件之間數(shù)據(jù)需要共享時(shí),數(shù)據(jù)被改變時(shí),組件全部被更新。

vuex 核心概念:

1. state:變量定義和初始化(組件中使用:this.$store.state.XX 獲取)
2. getters:以get方法 供外部調(diào)用來(lái)獲取state值(組件中使用:this.$store.getters.XXX 獲取)
3. mutations:mutations作用主要是改變state中的值,通過(guò)commit('XXX')觸發(fā)mutations中的方法,mutations中的方法必須是同步的,如果是異步的要放入actions中(組件中使用:this.$store.commit('XXX') 操作)
4. actions:actions中的所有操作都是異步的(具體業(yè)務(wù)操作),也可以提交mutations改變state值(組件中使用:this.$store.dispatch('XXX') 操作)
5. modules:將 store 分割成模塊,每個(gè)模塊都有自己的state、getters、mutations、actions

PS:1 - 4 操作可以通過(guò)導(dǎo)入模塊映射方式以this.XXX來(lái)操作,詳情見(jiàn)案例

案例

1.在src/main.js中使用vuex

....
省略路由和其他組件導(dǎo)入方式....
....
// 導(dǎo)入vuex
import store from './store'

//使用sotre
new Vue({
  el: '#app',
  router,
  store,  // vuex
  components: { App },
  template: '<App/>'
});

2. src/store/index.js (vuex配置)

// 導(dǎo)入vue
import Vue from 'vue'
// 導(dǎo)入vuex
import Vuex from 'vuex'
// 使用vuex
Vue.use(vuex);

//配置:
const store = new Vuex.Store({
   // 變量定義和初始化
  state:{
    num: 1
  },
  // 提供get方法 供外部調(diào)用,參數(shù)只有state
  getters: {
    getNum(state){
        return state.num;
    },
    // 通過(guò)參數(shù)getters方式調(diào)用其他get方法
    getNum2(state, getters){
      return getters.getNum;
    }
  },
  // mutations作用主要是改變state中的值,通過(guò)commit('XXX')觸發(fā)mutations中的方法,mutations中的方法必須是同步的,如果是異步的要放入actions中
  mutations: {
    //
    changeNum(state){
      //setTimeout(function(){ // 模擬異步操作
        state.num++;
      //}, 10)
    },
    //方法第二個(gè)參數(shù)為外部傳入,只能有一個(gè),如果多個(gè)參數(shù),第二個(gè)參數(shù)定義成對(duì)象
    changeNum2(state, num){
      state.num+=num;
    }
  },
  // 異步操作,提交mutations改變state值,actions中的所有操作都是異步的
  actions:{
    // 第一個(gè)參數(shù)直接以store接收
    changeNumFun(store){
        setTimeout( function(){ // 模擬異步操作,實(shí)際值是時(shí)時(shí)改變的
          store.commit('changeNum');
        }, 100);
    },
    //第一個(gè)參數(shù)以commit接收,第二個(gè)參數(shù)只能有一個(gè),如果多個(gè)值定義成對(duì)象
    changeNumFun2({commit}, num){
      commit('changeNum2', num)
    },
    // 異步操作 await等待返回
    async changeNumFun3(store){
      console.log('開(kāi)始fun3');
      var data = await store.dispatch('changeNumFun4');
      console.log(data);
      console.log('結(jié)束開(kāi)始fun3');

      // 打印結(jié)果: 開(kāi)始fun3、{'id': '111', name: 'zsstore'}、結(jié)束開(kāi)始fun3
      // 如果不使用await data輸出放在最后
    },
    changeNumFun4(store){
         return new Promise(resolve => {
            setTimeout(() => {
              var data = {'id': '111', name: 'zsstore'};
              resolve(data);
            }, 1000);
        });
    }
  }
});
// 導(dǎo)出
export default store;

3.src/page/vuex/index.vue(vuex案例)

<template>
  <div>
      vuex使用({{num}}): <br>
      使用getters獲?。簕{$store.getters.getNum2}}
      <br><br>
      {{$store.state.num}}
      <br><br>
      <button @click="cNum1">改變值 ++ (mutations)</button>
      <br><br>
      <button @click="cNum2">改變值 +2 (mutations)</button>
      <br><br>
      <button @click="cNum3">改變值 ++ (actions)</button>
      <br><br>
      <button @click="cNum4">改變值 +2 (actions)</button>
      <br><br>
      <button @click="cNum5">異步操作</button>
      <br><br>
      <button @click="cNum7">store中異步操作</button>
      <br><br>
      <button @click="cNum8">getters案例</button>
  </div>
</template>
<script>
  // 導(dǎo)入state
  import { mapState } from 'vuex'
  //導(dǎo)入mapMutations
  import { mapMutations } from 'vuex'
  // 導(dǎo)入mapActions
  import { mapActions } from 'vuex'
  // 導(dǎo)入mapGetters
  import { mapGetters } from 'vuex'
  //以上導(dǎo)入vuex各個(gè)模塊,在本組件中通過(guò)映射方式定義,就可以以this.XXX來(lái)操作,否則就要this.$store.XXX來(lái)操作

  export default {
    data(){
      retrun {
          
      }
    },
    computed:{
        // 映射 store的state
        ...mapState({
          num: state => state.num
        }),
        // 映射 store的getters
        ...mapGetters([
          'getNum',
          'getNum2',
        ])
    },
    methods:{
        //映射store的mutations
        ...mapMutations([
          'changeNum2',
          'changeNum'
        ]),
        // 映射store中的actions
        ...mapActions([
            'changeNumFun',
            'changeNumFun2'
        ]),
        //
        cNum1(){
          // 通過(guò)commit提交mutations改變state值
          //this.$store.commit('changeNum')

          // 通過(guò)mapMutations注入,直接this調(diào)用即可
          this.changeNum();
        },
        cNum2(){
          //this.$store.commit('changeNum2', 2);
          //
          this.changeNum2(3);
        },
        cNum3(){
          //this.$store.dispatch('changeNumFun')
          this.changeNumFun();
        },
        cNum4(){
          //this.$store.dispatch('changeNumFun2', 2)
          this.changeNumFun2(21,10);
        },
        async cNum5(){
          // 1.
          // var x = await this.cNum6().then((r)=>{
          //   console.log('r------------');
          //   console.log(r);
          //   return r;
          // });

          // 2.
          var x = await this.cNum6();
          console.log(x);
          console.log('調(diào)用完畢后事件...');
        },
        cNum6(){
          return new Promise(resolve => {
            setTimeout(() => {
              var data = {'id': '111', name: 'zs'};
              resolve(data);
            }, 1000);
          });
        },
        cNum7(){
          this.$store.dispatch('changeNumFun3')
        },
        cNum8(){
          //console.log(this.$store.getters.getNum);
          // 通過(guò)
          console.log(this.getNum2);
        }
    },
    created(){
      console.log(this.$store.state.num);
    }
  }
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容