為什么必須是同步更新?
因為在開發(fā)過程中,我們常常會追蹤狀態(tài)的變化袖订。常用的手段就是在瀏覽器控制臺中調(diào)試。而在 mutation 中使用異步更新狀態(tài)谨胞,雖然也會使?fàn)顟B(tài)正常更新,但是會導(dǎo)致開發(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次:
第2次:
... ...
第5次:
二、點擊異步 (在mutations里面做異步操作)
1忘朝、在3s內(nèi)點擊異步按鈕5次灰署,因為異步操作未完成,所以在時間線里面可以看到點擊的這5次count都是0局嘁。頁面中的count不會隨著點擊變化而變化溉箕,而是在3s后計算總和100
2、在3s后點擊異步按鈕1次(第六次點擊)悦昵,時間線上的count為前五次的總和100肴茄,而頁面且為6次點擊的總和120
總結(jié)
可以看到在Mutation中使用異步和同步最終頁面的總和都是正確的,也就是說在Mutation中使用異步不會對數(shù)據(jù)造成丟失和其他影響但指。然而我們注意Vue Devtools顯示結(jié)果寡痰,當(dāng)我們?nèi)ゲ榭炊啻蜯utation狀態(tài)時,發(fā)現(xiàn)同步的顯示Ok棋凳,異步的Count顯示為0 和我們預(yù)期結(jié)果不一致拦坠,所以會造成狀態(tài)改變的不可追蹤,所以官方說我們Mutation是同步的剩岳!
重點事情
造成狀態(tài)改變的不可追蹤
造成狀態(tài)改變的不可追蹤
造成狀態(tài)改變的不可追蹤
在actions中就不會出現(xiàn)這種狀態(tài)改變不可追蹤的情況