欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年09月16日 16:09:19   作者:zhq2005095  
今天小編就為大家分享一篇vue-vuex中使用commit提交mutation來修改state的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

所以只好自己去查看vuex的源碼,并且自己做demo進行驗證。

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

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

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

在vuex官方文檔上看到了關于嚴格模式的描述:

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

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

于是,將vuex設置成了嚴格模式。

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

錯誤提示:

Do not mutate vuex store state outside mutation handlers.

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

commit修改state源碼分析

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

首先應該分析commit函數(shù)的代碼,因為mutation是通過commit函數(shù)來執(zhí)行的。

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

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

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

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

Do not mutate vuex store state outside mutation handlers.

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

結語

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

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

相關文章

  • Vue完整版和runtime版的區(qū)別詳解

    Vue完整版和runtime版的區(qū)別詳解

    這篇文章主要為大家介紹了Vue完整版和runtime版的區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Vue-router 中hash模式和history模式的區(qū)別

    Vue-router 中hash模式和history模式的區(qū)別

    這篇文章主要介紹了Vue-router 中hash模式和history模式的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • vue 實現(xiàn)特定條件下綁定事件

    vue 實現(xiàn)特定條件下綁定事件

    今天小編就為大家分享一篇vue 實現(xiàn)特定條件下綁定事件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue中iframe的使用及說明

    vue中iframe的使用及說明

    這篇文章主要介紹了vue中iframe的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue驗證碼組件使用方法詳解

    vue驗證碼組件使用方法詳解

    這篇文章主要為大家詳細介紹了vue驗證碼組件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 深入理解Vue.js輕量高效的前端組件化方案

    深入理解Vue.js輕量高效的前端組件化方案

    這篇文章主要介紹了深入理解Vue.js輕量高效的前端組件化方案 ,需要的朋友可以參考下
    2018-12-12
  • layui實際項目使用過程中遇到的兼容性問題及解決

    layui實際項目使用過程中遇到的兼容性問題及解決

    這篇文章主要介紹了layui實際項目使用過程中遇到的兼容性問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vsCode一鍵生成vue模板

    vsCode一鍵生成vue模板

    之前關于vsCode一鍵生成vue模,最近需要回顧,就順便發(fā)到隨筆上了,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • vue?elementui動態(tài)添加el-input實例代碼

    vue?elementui動態(tài)添加el-input實例代碼

    最近遇到一個新的需求,需要動態(tài)添加el-input,這篇文章主要給大家介紹了關于vue?elementui動態(tài)添加el-input的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)

    如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)

    這篇文章主要給大家介紹了關于如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)的相關資料,Vue-json-viewer是一個Vue組件,用于在Vue應用中顯示JSON數(shù)據(jù)的可視化工具,需要的朋友可以參考下
    2023-11-11

最新評論