Mutation不能使用異步函數(shù)

為什么必須是同步更新?
因為在開發(fā)過程中,我們常常會追蹤狀態(tài)的變化。常用的手段就是在瀏覽器控制臺中調(diào)試。而在 mutation 中使用異步更新狀態(tài),雖然也會使狀態(tài)正常更新,但是會導致開發(fā)者工具有時無法追蹤到狀態(tài)的變化,調(diào)試起來就會很困難。

index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
const state = { count: 0}

const mutations = {
  synchronization (state, params) {
    state.count += params.num
  },
  asynchronous (state, params) {
    setTimeout(() => {
      state.count += params.num
    }, 3000)
  }
}
export default new Vuex.Store({state,mutations})
<template>
  <div class="content">
    <h3>測試在mutations使用同步和異步</h3>
    <button @click="sync">同步</button>
    <button @click="async">異步</button>
    <p style="font-size: 30px;">這是vuex中的 <span style="color:red">{{ $store.state.count }}</span></p>
  </div>
</template>

export default {
  methods: {
    sync () {
      this.$store.commit({
        type: 'synchronization',
        num: 20
      })
    },
    async () {
      this.$store.commit({
        type: 'asynchronous',
        num: 20
      })
    }
  }
}

我們來看Devtools的Vuex狀態(tài)圖

一、點擊同步 (在mutations里面做同步操作)

點擊5次,點擊時間線可以看到5次的點擊每次都是增加20,頁面中的count會隨著點擊變化而變化20>40>60>80>100

第1次:

image.png

第2次:

image.png

... ...

第5次:

image.png

二、點擊異步 (在mutations里面做異步操作)

1、在3s內(nèi)點擊異步按鈕5次,因為異步操作未完成,所以在時間線里面可以看到點擊的這5次count都是0。頁面中的count不會隨著點擊變化而變化,而是在3s后計算總和100


image.png

2、在3s后點擊異步按鈕1次(第六次點擊),時間線上的count為前五次的總和100,而頁面且為6次點擊的總和120


image.png

總結(jié)

可以看到在Mutation中使用異步和同步最終頁面的總和都是正確的,也就是說在Mutation中使用異步不會對數(shù)據(jù)造成丟失和其他影響。然而我們注意Vue Devtools顯示結(jié)果,當我們?nèi)ゲ榭炊啻蜯utation狀態(tài)時,發(fā)現(xiàn)同步的顯示Ok,異步的Count顯示為0 和我們預期結(jié)果不一致,所以會造成狀態(tài)改變的不可追蹤,所以官方說我們Mutation是同步的!

重點事情
造成狀態(tài)改變的不可追蹤
造成狀態(tài)改變的不可追蹤
造成狀態(tài)改變的不可追蹤

在actions中就不會出現(xiàn)這種狀態(tài)改變不可追蹤的情況

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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