最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vuex?Mutations同步Actions異步原理解析

 更新時間:2022年12月11日 09:45:15   作者:Maic  
這篇文章主要為大家介紹了vuex?Mutations同步Actions異步原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

vuexmutationsactions有什么區(qū)別,除了用法上mutation是同步,actions是異步,這里的同步與異步指的是commitordispatch?并不是,同步指mutations方的內(nèi)部是同步的,而actions內(nèi)部可以是異步的,并且修改數(shù)據(jù)只能在mutations中修改,在actions中異步的操作副作用是通過mutations來記錄。本文是一篇筆者記錄vuex關(guān)于mutationsactions的筆記。

避坑

如果使用vue-cli2模版搭建的基礎(chǔ)項目,注意,如果使用vue版本是2,當(dāng)你你默認(rèn)安裝vuex肯定是4.x版本了,這里需要注意的是,你要降低vuex版本到3.x版本,不然store掛載不到vue

mutation

當(dāng)我們修改數(shù)據(jù),只能通過mutation修改state

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
  state: {
    data: []
  },
  mutations: {
    storeData (state, payload) {
      state.data = state.data.concat(payload)
    }
  }
})

在頁面中

import { mockFeatchData } from '@/mock'
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  computed: {
    ...mapState({
      dataList: state => state.data
    })
  },
  methods: {
    handleData () {
      mockFeatchData().then(res => {
        this.$store.commit('storeData', res)
      })
    }
  }
}

我們修改數(shù)據(jù)就是$store.commit('eventName', payload),當(dāng)我們觸發(fā)commit時,實際上是已經(jīng)在異步請求回調(diào)里獲取了數(shù)據(jù)。

但是官方在描述mutation有這么說,mutation內(nèi)部必須是同步函數(shù),異步會導(dǎo)致內(nèi)部狀態(tài)難以追蹤,devtool難以追蹤state的狀態(tài)

...
mutations: {
    storeData (state, payload) {
      mockFeatchData().then((res) => {
        console.log(res)
         state.data = state.data.concat(res)
      })
    }
},

也就是說上面這段代碼,當(dāng)我們在mutations中的storeData中使用了異步函數(shù),我們在$store.commit('storeData')時,很難追蹤state的狀態(tài),因為在觸發(fā)commit事件時,異步的回調(diào)函數(shù)不知道什么時候執(zhí)行,所以難以追蹤。

mutations是同步事務(wù),假設(shè)在mutations有多個異步的調(diào)用,你很難確定這些異步哪些先執(zhí)行,很難追蹤state的變化,所以也給調(diào)試帶來了一定難度

話說回來,這么寫也確實是可以做到更新state的值,如果我不用vuetool這個工具,貌似也沒毛病

既然mutations是同步的事情,那么異步官方就使用了actions方案

actions

actions里面可以做異步操作,但是并不是直接修改數(shù)據(jù),提交的是mutations里面的方法

mutations: {
    storeData (state, payload) {
      state.data = state.data.concat(payload)
    }
},
actions: {
    setStoreData ({ commit }) {
      mockFeatchData().then((res) => {
        commit('storeData', res)
      })
    }
 }

在頁面中就是這樣觸發(fā)actions

 methods: {
    handleData () {
      this.$store.dispatch('setStoreData')
    }
  }

我們把異步操作放在了actions的方法里面,你會發(fā)現(xiàn)mockFeatchData這是一個異步操作后的結(jié)果,然后通過commit傳給了mutations

actions執(zhí)行異步操作,將結(jié)果給了mutationsmutations中同步修改狀態(tài)state,使得actions的操作在mutations中有記錄。

actions中也可以有多個異步操作

 mutations: {
    storeData (state, payload) {
      state.data = state.data.concat(payload)
    },
    storeText (state, payload) {
      state.text = payload
    }
  },
 actions: {
    setStoreData ({ commit }) {
      mockFeatchData().then((res) => {
        console.log(res, '111')
        commit('storeData', res)
      })
    },
    setStoreText ({ dispatch, commit }, payload) {
      dispatch('setStoreData').then(() => {
        console.log(222)
        commit('storeText', payload)
      })
    }
  }

頁面上是這樣觸發(fā)actions

 handleText () {
      this.$store.dispatch('setStoreText', `hello,${Math.random()}`)
    }

這里我們也可以用對象的方式

 handleText () {
    this.$store.dispatch({
    type: 'setStoreText',
    payload: `hello,${Math.random()}`
})

不過此時注意actions中獲取值需要解構(gòu)才行

setStoreText ({ dispatch, commit }, {payload}) {
      dispatch('setStoreData').then(() => {
        console.log(222, payload)
        commit('storeText', payload)
      })
}

在actions可以dispatch另一個異步的操作,也就是等一個任務(wù)完成了后,可以執(zhí)行另一個commit

看到這里貌似這里有點(diǎn)明白,為啥所有的異步操作放在actions里面了,mutation只負(fù)責(zé)修改state,所有異步操作產(chǎn)生的副作用的結(jié)果都統(tǒng)統(tǒng)交給了mutation,這樣很好保證devtool了對數(shù)據(jù)的追蹤。

總結(jié)

靈魂拷問,為什么會有actions中是異步,而mutations是同步,從官方解釋來看,修改state數(shù)據(jù)必須只能mutations中修改,而假設(shè)mutions內(nèi)部有異步,那么會帶來devtool無法準(zhǔn)確追蹤state變化,因為多個異步并不知道哪個異步會先執(zhí)行完。但是話說回來,mutations中有異步,依然可以修改state啊,因為業(yè)務(wù)中我并不太需要知道devtool是如何追蹤state的變化,但是為了遵從規(guī)范,所有的異步都在actions中處理,mutations只集中干一件事,直接修改state

actions是異步操作的,actions中可以有多個異步操作,但是最終的結(jié)果依然是交給mutations去修改的,也就是說actions中異步操作的副作用統(tǒng)一交給了mutations去記錄

多個異步任務(wù)可以在actions中觸發(fā),dispatch('xxx')返回的是一個Promise

本文code example

以上就是vuex Mutations同步Actions異步原理解析的詳細(xì)內(nèi)容,更多關(guān)于vuex Mutations Actions的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue中wangEditor5編輯器的基本使用

    vue中wangEditor5編輯器的基本使用

    wangEditor是一個輕量級web富文本編輯器,配置方便,使用簡單,下面這篇文章主要給大家介紹了關(guān)于vue中wangEditor5編輯器的基本使用,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 一次vue項目優(yōu)化的實際操作記錄

    一次vue項目優(yōu)化的實際操作記錄

    用vue開發(fā)項目上線以后,發(fā)現(xiàn)首頁加載速度非常慢,如果項目比較大,甚至可能出現(xiàn)10s以上的等待,下面這篇文章主要給大家介紹了關(guān)于vue項目優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 手寫vite插件教程示例

    手寫vite插件教程示例

    這篇文章主要為大家介紹了手寫一個vite插件教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • vue使用swiper實現(xiàn)左右滑動切換圖片

    vue使用swiper實現(xiàn)左右滑動切換圖片

    這篇文章主要為大家詳細(xì)介紹了vue使用swiper實現(xiàn)左右滑動切換圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 詳解vue更改頭像功能實現(xiàn)

    詳解vue更改頭像功能實現(xiàn)

    這篇文章主要介紹了vue更改頭像功能實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • vue項目中掃碼支付的實現(xiàn)示例(附demo)

    vue項目中掃碼支付的實現(xiàn)示例(附demo)

    本文主要介紹了vue項目中掃碼支付的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue中@change兼容問題詳解

    vue中@change兼容問題詳解

    這篇文章主要介紹了vue中@change兼容問題詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • uniapp定義new plus.nativeObj.View實現(xiàn)APP端全局彈窗功能

    uniapp定義new plus.nativeObj.View實現(xiàn)APP端全局彈窗功能

    文章介紹了在UniApp中使用`newplus.nativeObj.View`實現(xiàn)彈窗的原因和方法,它定義了一個`AppPopupView`彈窗函數(shù),并在`main.js`中掛載到全局頁面,以便在任何地方調(diào)用,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Vue.use()在new Vue() 之前使用的原因淺析

    Vue.use()在new Vue() 之前使用的原因淺析

    本文通過實例代碼給大家介紹了為什么Vue.use()在new Vue() 之前使用,需要的朋友可以參考下
    2019-08-08
  • vue2.0構(gòu)建單頁應(yīng)用最佳實戰(zhàn)

    vue2.0構(gòu)建單頁應(yīng)用最佳實戰(zhàn)

    這篇文章主要為大家分享了vue2.0構(gòu)建單頁應(yīng)用最佳實戰(zhàn)案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論

霍城县| 涟水县| 乃东县| 玛曲县| 汶上县| 军事| 松滋市| 时尚| 景宁| 鄂伦春自治旗| 长垣县| 叶城县| 昌图县| 松溪县| 乌鲁木齐县| 鄄城县| 汝南县| 海阳市| 常宁市| 信阳市| 定襄县| 靖江市| 临汾市| 铜梁县| 垫江县| 开原市| 名山县| 枣阳市| 宁德市| 山东省| 秦皇岛市| 婺源县| 广灵县| 石棉县| 台安县| 阿瓦提县| 保德县| 隆德县| 兴宁市| 乌兰浩特市| 洪泽县|