鍍金池/ 問(wèn)答/HTML/ vuex使用mutations處理異步請(qǐng)求的問(wèn)題,在chrome插件中查看sta

vuex使用mutations處理異步請(qǐng)求的問(wèn)題,在chrome插件中查看state的狀態(tài)與頁(yè)面顯示的不一樣

demo github地址

vuex處理異部事件要使用actions,同步使用mutations;
在使用chrome的vue的插件中可以查看state值的狀態(tài);
發(fā)現(xiàn)使用actions數(shù)據(jù)與頁(yè)面是對(duì)應(yīng)的;mutations總是顯示上一次操作的最后結(jié)果;
但是在界面顯示效果中,兩者沒(méi)有任何區(qū)別;為什么會(huì)這樣?什么情況下可以看出兩者的區(qū)別?

clipboard.png

test.vue

<template>
  <div>
    <div style="border: 1px solid #ddd;padding: 10px;margin-bottom: 20px;">
      <h2>mutations處理異步操作</h2>
      <button type="text" @click="reduce(10)">-</button>
      <span>{{count}}</span>
      <button type="text" @click="addIncrement(10)">+</button>
     <p> 限制數(shù)字: {{limitNum}}</p>
    </div>

    <div style="border: 1px solid #ddd;padding: 10px;margin-bottom: 20px;">
      <h2>actions處理異步操作</h2>
      <button type="text" @click="reduceAction(10)">-</button>
      <span>{{count2}}</span>
      <button type="text" @click="addAction(10)">+</button>
      <p> 限制數(shù)字: {{limitNum2}}</p>
    </div>

  </div>
</template>

<script>
  import {mapState,mapMutations,mapActions,mapGetters} from "vuex"
export default {
  name: 'app',
  data () {
    return {
    }
  },
  computed:{
    ...mapState(["count","count2"]),
    ...mapGetters(["limitNum","limitNum2"])
  },
  methods:{
    ...mapMutations(["addIncrement","reduce"]),  // 同步
    ...mapActions(["addAction","reduceAction"])  //異步
  },
  created:function(){
  }
}
</script>

<style>
</style>

store/index.js 中的內(nèi)容

/**
 * Created by Administrator on 2018/1/19.
 */
import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex);

var store =new Vuex.Store({  //注意這里的Store是大寫(xiě)
  state:{
    count:100,
    count2:100
  },
  mutations:{
    addIncrement:function(state,n){
      setTimeout(function(){
        state.count+=n;
      },600)
    },
    reduce:function(state,n){
      setTimeout(function(){
        state.count-=n;
      },600)
    },
    addIncrement2:function(state,n){
        state.count2+=n;
    },
    reduce2:function(state,n){
        state.count2-=n;
    },
  },
  actions:{
    addAction:function(context,n){
      setTimeout(function(){
        context.commit("addIncrement2",n);
      },600)
    },
    reduceAction:function(context,n){
      setTimeout(function(){
        context.commit("reduce2",n);
      },600)
    },
  },
  getters:{
    limitNum:function(state){
      var a=state.count>120?120:state.count;
      return a;
    },
    limitNum2:function(state){
      var a=state.count2>120?120:state.count2;
      return a;
    }
  }
})

export default store
回答
編輯回答
小眼睛

https://vuex.vuejs.org/zh-cn/...

引用文檔的話

Mutation 必須是同步函數(shù)
一條重要的原則就是要記住 mutation 必須是同步函數(shù)。為什么?請(qǐng)參考下面的例子:
mutations: {
  someMutation (state) {
    api.callAsyncMethod(() => {
      state.count++
    })
  }
}
現(xiàn)在想象,我們正在 debug 一個(gè) app 并且觀察 devtool 中的 mutation 日志。每一條 mutation 被記錄,devtools 都需要捕捉到前一狀態(tài)和后一狀態(tài)的快照。然而,在上面的例子中 mutation 中的異步函數(shù)中的回調(diào)讓這不可能完成:因?yàn)楫?dāng) mutation 觸發(fā)的時(shí)候,回調(diào)函數(shù)還沒(méi)有被調(diào)用,devtools 不知道什么時(shí)候回調(diào)函數(shù)實(shí)際上被調(diào)用——實(shí)質(zhì)上任何在回調(diào)函數(shù)中進(jìn)行的狀態(tài)的改變都是不可追蹤的。
2017年6月14日 01:01