<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
vuex的mutations
與actions
有什麼區別,除了用法上mutation
是同步,actions
是非同步,這裡的同步與非同步指的是commit
ordispatch
?並不是,同步指mutations
方的內部是同步的,而actions
內部可以是非同步的,並且修改資料只能在mutations
中修改,在actions
中非同步的操作副作用是通過mutations
來記錄。本文是一篇筆者記錄vuex
關於mutations
與actions
的筆記。
如果使用vue-cli2
模版搭建的基礎專案,注意,如果使用vue
版本是2,當你你預設安裝vuex
肯定是4.x
版本了,這裡需要注意的是,你要降低vuex
版本到3.x
版本,不然store
掛載不到vue
上
當我們修改資料,只能通過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) }) } } }
我們修改資料就是$store.commit('eventName', payload)
,當我們觸發commit
時,實際上是已經在非同步請求回撥裡獲取了資料。
但是官方在描述mutation
有這麼說,mutation
內部必須是同步函數,非同步會導致內部狀態難以追蹤,devtool
難以追蹤state
的狀態
... mutations: { storeData (state, payload) { mockFeatchData().then((res) => { console.log(res) state.data = state.data.concat(res) }) } },
也就是說上面這段程式碼,當我們在mutations
中的storeData
中使用了非同步函數,我們在$store.commit('storeData')
時,很難追蹤state
的狀態,因為在觸發commit事件時,非同步的回撥函數不知道什麼時候執行,所以難以追蹤。
mutations
是同步事務,假設在mutations
有多個非同步的呼叫,你很難確定這些非同步哪些先執行,很難追蹤state
的變化,所以也給偵錯帶來了一定難度
話說回來,這麼寫也確實是可以做到更新state的值,如果我不用vuetool
這個工具,貌似也沒毛病
既然mutations
是同步的事情,那麼非同步官方就使用了actions
方案
actions
裡面可以做非同步操作,但是並不是直接修改資料,提交的是mutations
裡面的方法
mutations: { storeData (state, payload) { state.data = state.data.concat(payload) } }, actions: { setStoreData ({ commit }) { mockFeatchData().then((res) => { commit('storeData', res) }) } }
在頁面中就是這樣觸發actions
的
methods: { handleData () { this.$store.dispatch('setStoreData') } }
我們把非同步操作放在了actions
的方法裡面,你會發現mockFeatchData
這是一個非同步操作後的結果,然後通過commit
傳給了mutations
中
在actions
執行非同步操作,將結果給了mutations
,mutations
中同步修改狀態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) }) } }
頁面上是這樣觸發actions
的
handleText () { this.$store.dispatch('setStoreText', `hello,${Math.random()}`) }
這裡我們也可以用物件的方式
handleText () { this.$store.dispatch({ type: 'setStoreText', payload: `hello,${Math.random()}` })
不過此時注意actions
中獲取值需要解構才行
setStoreText ({ dispatch, commit }, {payload}) { dispatch('setStoreData').then(() => { console.log(222, payload) commit('storeText', payload) }) }
在actions可以dispatch
另一個非同步的操作,也就是等一個任務完成了後,可以執行另一個commit
看到這裡貌似這裡有點明白,為啥所有的非同步操作放在actions
裡面了,mutation
只負責修改state
,所有非同步操作產生的副作用的結果都統統交給了mutation
,這樣很好保證devtool
了對資料的追蹤。
靈魂拷問,為什麼會有actions
中是非同步,而mutations
是同步,從官方解釋來看,修改state資料必須只能mutations
中修改,而假設mutions
內部有非同步,那麼會帶來devtool
無法準確追蹤state
變化,因為多個非同步並不知道哪個非同步會先執行完。但是話說回來,mutations
中有非同步,依然可以修改state啊,因為業務中我並不太需要知道devtool
是如何追蹤state
的變化,但是為了遵從規範,所有的非同步都在actions
中處理,mutations
只集中幹一件事,直接修改state
值
actions
是非同步操作的,actions
中可以有多個非同步操作,但是最終的結果依然是交給mutations
去修改的,也就是說actions
中非同步操作的副作用統一交給了mutations
去記錄
多個非同步任務可以在actions
中觸發,dispatch('xxx')
返回的是一個Promise
以上就是vuex Mutations同步Actions非同步原理解析的詳細內容,更多關於vuex Mutations Actions的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45