(1)同步與異步
在 mutation 中混合異步調用會導致你的程序很難調試。
例如,當你調用了兩個包含異步回調的 mutation 來改變狀態,你怎么知道什么時候回調和哪個先回調呢?
這就是為什么我們要區分這兩個概念。在 Vuex 中,mutation 都是同步事務:
store.commit(event-name) /* 任何由 "event-name" 導致的狀態變更都應該在此刻完成 */
為了處理異步操作,vuex出了Action
(2)注冊:定義actions動作提交mutation異變函數
目前為止,我們看到,當點擊后頁面上的值是改變了。我們達到了修改store中狀態值的目的,但是,官方並不推薦我們這樣直接去修改store里面的值,而是去提交一個actions,在actions中提交mutation再去修改狀態值,接下來我們修改index.js文件,先定義actions提交mutation的函數:
【store/index.js】
(3)觸發:分發 Action
Action 通過 store.dispatch 方法觸發
把commit提交mutations修改為使用dispatch來提交actions,之后我們再點擊頁面,效果是一樣的。
(4)優勢---異步執行
乍一眼看上去感覺多此一舉,我們直接分發 mutation 豈不更方便?實際上並非如此,還記得 mutation 必須同步執行這個限制么?Action 就不受約束!可以在 action 內部執行異步操作。
【store/index.js】---①異步注冊:定義actions動作提交mutation異變函數
【.vue單文件組件】---②觸發:分發異步Action
(5)載荷方式和對象方式進行分發
Actions 支持同樣的載荷方式和對象方式進行分發
①載荷形式
②對象形式類似
(6)組合 Action----promise
Action 通常是異步的,那么如何知道 action 什么時候結束呢?更重要的是,我們如何才能組合多個 action,以處理更加復雜的異步流程?
首先需要明白 store.dispatch 可以處理被觸發的 action 的處理函數返回的 Promise,並且 store.dispatch 仍舊返回 Promise.如果利用 async / await,也可以實現其他組合 action
一個 store.dispatch 在不同模塊中可以觸發多個 action 函數。在這種情況下,只有當所有觸發函數完成后,返回的 Promise 才會執行。
這個之后章節再做介紹。
.