亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

VUEX-action可以修改state嗎

 更新時(shí)間:2019年11月19日 09:15:35   作者:rain_li  
這篇文章主要介紹了VUEX-action可以修改state嗎,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

首先回顧下vuex,官網(wǎng)圖如下

  • Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation(mutation類似于事件且必須是同步函數(shù))
  • action 提交的是 mutation,而不是直接變更狀態(tài)且可以包含任意異步操作(Action通過 store.dispatch 方法觸發(fā))

一幅圖看清只能通過mutation修改state的原因


commit函數(shù)源碼如下

 commit (_type, _payload, _options) {
  // check object-style commit
  const {
   type,
   payload,
   options
  } = unifyObjectStyle(_type, _payload, _options)

  const mutation = { type, payload }
  const entry = this._mutations[type]
  if (!entry) {
   if (process.env.NODE_ENV !== 'production') {
    console.error(`[vuex] unknown mutation type: ${type}`)
   }
   return
  }
  // 用來修改state
  this._withCommit(() => {
   entry.forEach(function commitIterator (handler) {
    handler(payload)
   })
  })
  this._subscribers.forEach(sub => sub(mutation, this.state))

  if (
   process.env.NODE_ENV !== 'production' &&
   options && options.silent
  ) {
   console.warn(
    `[vuex] mutation type: ${type}. Silent option has been removed. ` +
    'Use the filter functionality in the vue-devtools'
   )
  }
 }

this._withCommit來修改state,其源代碼如下

_withCommit (fn) {
 const committing = this._committing
 this._committing = true
 fn()
 this._committing = committing
}

其中_withCommit函數(shù)的參數(shù)fn是修改state的函數(shù),在執(zhí)行fn函數(shù)前,將this._committing置為true,理由是在源代碼的251行resetStoreVM函數(shù)中判斷嚴(yán)格模式的代碼,如下:

if (store.strict) {
 enableStrictMode(store)
}

當(dāng) vuex設(shè)置為嚴(yán)格模式, 執(zhí)行enableStrictMode函數(shù), 源碼如下:

function enableStrictMode (store) {
 // $watch 函數(shù)來觀察 state的變化
 store._vm.$watch(function () { return this._data.$$state }, () => {
 // tate變化時(shí),調(diào)用 assert函數(shù)
 if (process.env.NODE_ENV !== 'production') {
 // 判斷 store._committing
  assert(store._committing, `do not mutate vuex store state outside mutation handlers.`)
 }
 }, { deep: true, sync: true })
}

當(dāng)store._committing(this._committing)不為true,就會(huì)報(bào)出異常。
所以,當(dāng)不是觸發(fā)mutation來修改state, 就不會(huì)執(zhí)行commit函數(shù),也不會(huì)執(zhí)行_withcommit函數(shù),this._committing = true不會(huì)執(zhí)行,當(dāng)執(zhí)行 enableStrictMode 時(shí),會(huì)執(zhí)行 assert 函數(shù),這時(shí)store._committing為false,就會(huì)報(bào)出異常。

回歸標(biāo)題action可以修改state嗎

不開啟嚴(yán)格模式的情況下可以,但是不提倡。

綜上所述,經(jīng)測(cè)試得知可以修改并修改成功,但是嚴(yán)格模式下控制臺(tái)會(huì)拋異常且action是異步的,不方便DevTool 調(diào)試

結(jié)語

我們開發(fā)要嚴(yán)格按照官方文檔開發(fā),避免不必要的錯(cuò)誤產(chǎn)生。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue實(shí)現(xiàn)炫酷的代碼瀑布流背景

    Vue實(shí)現(xiàn)炫酷的代碼瀑布流背景

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)炫酷的代碼瀑布流背景,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • vue中$emit傳遞多個(gè)參(arguments和$event)

    vue中$emit傳遞多個(gè)參(arguments和$event)

    本文主要介紹了vue中$emit傳遞多個(gè)參(arguments和$event),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • vue實(shí)現(xiàn)元素拖動(dòng)并互換位置的實(shí)現(xiàn)代碼

    vue實(shí)現(xiàn)元素拖動(dòng)并互換位置的實(shí)現(xiàn)代碼

    在使用Vue的場(chǎng)景下,需要實(shí)現(xiàn)對(duì)元素進(jìn)行拖動(dòng)交換位置,接下來通過本文給大家介紹vue實(shí)現(xiàn)元素拖動(dòng)并互換位置的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-09-09
  • vue中this.$router.push()路由傳值和獲取的兩種常見方法匯總

    vue中this.$router.push()路由傳值和獲取的兩種常見方法匯總

    這篇文章主要介紹了vue中this.$router.push()路由傳值和獲取的兩種常見方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Vue實(shí)現(xiàn)項(xiàng)目部署到非根目錄及解決刷新頁(yè)面時(shí)找不到資源

    Vue實(shí)現(xiàn)項(xiàng)目部署到非根目錄及解決刷新頁(yè)面時(shí)找不到資源

    這篇文章主要介紹了Vue實(shí)現(xiàn)項(xiàng)目部署到非根目錄及解決刷新頁(yè)面時(shí)找不到資源問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue文件配置全局變量的實(shí)例

    Vue文件配置全局變量的實(shí)例

    今天小編就為大家分享一篇Vue文件配置全局變量的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue3 $attrs和inheritAttrs的用法說明

    vue3 $attrs和inheritAttrs的用法說明

    這篇文章主要介紹了vue3 $attrs和inheritAttrs的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue 路由懶加載詳情

    vue 路由懶加載詳情

    這篇文章主要介紹了vue 路由懶加載,當(dāng)打包構(gòu)建應(yīng)用時(shí),JavaScript 包會(huì)變得非常大,影響頁(yè)面加載,這便是vue 路由懶加載,接下來隨小編一起進(jìn)入文章了解更多詳細(xì)內(nèi)容吧
    2021-10-10
  • 詳解vue項(xiàng)目中使用vuedraggable

    詳解vue項(xiàng)目中使用vuedraggable

    這篇文章主要介紹了vue項(xiàng)目中使用vuedraggable,本文給大家介紹了錯(cuò)誤問題分析及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • django使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊

    django使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊

    這篇文章主要介紹了django使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11

最新評(píng)論