溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue-vuex中使用commit提交mutation來修改state的方法詳解

發(fā)布時間:2020-08-31 14:25:00 來源:腳本之家 閱讀:821 作者:zhq2005095 欄目:web開發(fā)

在vuex中,關(guān)于修改state的方式,需要commit提交mutation。官方文檔中有這么一句話:

更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。

為了搞清楚其原因,查閱了很多資料,發(fā)現(xiàn)其它人在做vuex的源碼解析的時候,并沒有將這點(diǎn)說的很明白。

所以只好自己去查看vuex的源碼,并且自己做demo進(jìn)行驗(yàn)證。

但是試驗(yàn)后,發(fā)現(xiàn)直接修改state時,store中的state能夠改變,并且是響應(yīng)式的,并沒有報錯。跟commit提交mutation的方式?jīng)]啥區(qū)別。

后來在github上遇到一位朋友,提醒試試嚴(yán)格模式下會發(fā)生什么。

一、兩種修改state方式的區(qū)別

在vuex官方文檔上看到了關(guān)于嚴(yán)格模式的描述:

開啟嚴(yán)格模式,僅需在創(chuàng)建 store 的時候傳入 strict: true;

在嚴(yán)格模式下,無論何時發(fā)生了狀態(tài)變更且不是由 mutation 函數(shù)引起的,將會拋出錯誤。這能保證所有的狀態(tài)變更都能被調(diào)試工具跟蹤到。

于是,將vuex設(shè)置成了嚴(yán)格模式。

直接修改state發(fā)現(xiàn)控制臺確實(shí)是報出了錯誤,但是state修改成功,并且依然是響應(yīng)式的。

錯誤提示:

Do not mutate vuex store state outside mutation handlers.

vue-vuex中使用commit提交mutation來修改state的方法詳解

通過commit 提交 mutation 的方式來修改 state 時,vue的調(diào)試工具能夠記錄每一次state的變化,這樣方便調(diào)試。但是如果是直接修改state,則沒有這個記錄。

vue-vuex中使用commit提交mutation來修改state的方法詳解

commit修改state源碼分析

以上已經(jīng)討論了在嚴(yán)格模式下,直接修改state會造成報錯。接下來通過分析源碼來一探究竟。

首先應(yīng)該分析commit函數(shù)的代碼,因?yàn)閙utation是通過commit函數(shù)來執(zhí)行的。

vue-vuex中使用commit提交mutation來修改state的方法詳解

在commit函數(shù)內(nèi)部,由this._commit()函數(shù)來修改state。那么 _withCommit 又是什么呢,接著看 _withCommit 的代碼:

vue-vuex中使用commit提交mutation來修改state的方法詳解

_withCommit 函數(shù)的參數(shù) fn 就是修改state的函數(shù)。在執(zhí)行 fn() 之前,會將 this._committing 設(shè)置為 true。等到fn()執(zhí)行完畢后,又將 this._committing 的值進(jìn)行恢復(fù)。那么為什么要將 this._withCommitting設(shè)置為true,其作用到底是什么。在vuex/src/store.js 的開頭發(fā)現(xiàn)了判斷嚴(yán)格模式的代碼:

vue-vuex中使用commit提交mutation來修改state的方法詳解

這三行代碼很簡單:當(dāng) vuex設(shè)置為嚴(yán)格模式的時候,就會執(zhí)行 enableStrictMode 函數(shù)。那么 enableStrictMode 又是什么鬼?

vue-vuex中使用commit提交mutation來修改state的方法詳解

在 enableStrictMode 函數(shù)內(nèi)部,調(diào)用了 $watch 函數(shù)來觀察 state的變化。當(dāng)state變化時,就會調(diào)用 assert 函數(shù),判斷 store._committing(即 上文的 this._committing) 的值,如果不為 true,就會報出異常:

Do not mutate vuex store state outside mutation handlers.

所以,如果通過外部直接修改state,則沒有執(zhí)行 commit 函數(shù),也就沒有執(zhí)行 _withCommit 函數(shù),進(jìn)而 this._withCommitting 的值 不為 true,故當(dāng)執(zhí)行 enableStrictMode 時,則會執(zhí)行 assert 函數(shù),因?yàn)開withCommitting不為true,則報出異常了。

結(jié)語

綜上所述,在vuex中,最好設(shè)置成嚴(yán)格模式,并且按照文檔的要求,通過commit提交mutation的方式來修改state,而不要直接修改state。不然,控制臺會報錯,并且vue調(diào)試工具不會記錄state的變化,無法調(diào)試。

以上這篇vue-vuex中使用commit提交mutation來修改state的方法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI