Mutations
mutations 必須是同步函數,為什么?
舉個例子: 官方案例
mutations: { someMutation (state) { api.callAsyncMethod(() => { state.count++ }) }}
我們都知道任何回調函數中進行的狀態改變都是無法追蹤的, devtools會對mutations的每一條提交做記錄,記錄上一次提交之前和提交之后的狀態,在上面的例子中無法實現捕捉狀態,因為在執行mutations時,內部回調函數還沒有執行,
所以此時無法捕捉狀態.
再簡單來講,就像大家都吃過核桃,核桃剛產下來的時候是帶一層綠色的皮的,我們需要將綠色燒掉,弄掉了,才是我們在市場上見到的只有外面硬殼的核桃,如果我們只剝去綠皮,是不能直接吃的,因為還有一層殼胡著呢.
Actions
vuex肯定不甘示弱,為了解決mutations只有同步的問題,提出了actions(異步),專門用來解決mutations只有同步無異步的問題.
1. 首先先了解一下actions
(1).MUTATIONS
const state = { xxx: null }, const mutations = { [setState](state, value) { state.xxx = value } }
此處value可以是對象,可以是值等
組件調用方式: this.$store.commit('setState', [value])
(2).ACTIONS
// 第一種寫法簡寫形式 const actions = { [addPlus]({commit}) { // 簡寫方式,待研究 commit('[setState]', value) //此處value可以是對象,可以是固定值等 } } // 第二種形式 const actions = { [addPlus](context) { //context 官方給出的指定對象, 此處context可以理解為store對象 context.commit('[setState]', value) } } /* 兩處的commit都是提交的mutations中的字符串的事件類型名稱,對應會調用mutations中的回調函數 */ actions在組件中的調用方式: import mapActions from 'vuex' methods: { ...mapActions: ([ 'addPlus' ]), setAddPlus () { this.$store.dispatch('addPlus', [value]) // 異步調用mutations } }
Vuex 狀態管理
Vuex 依賴于 Vue 用來管理 Vue 項目狀態
狀態的修改依賴于 commit 和 dispatch
import Vue from 'Vue';import Vuex from 'Vuex';export default new Vuex.Store({ state:{ count:100 }, mutations:{ change(state,payload){ state.count += payload; } }, actions:{ change(context,palyload){ context.commit('change',palyload);// 異步觸發 mutaiton } }, getters:{ getCount(){ return state.count; } }})
{{$store.state.count}}<button @click="commitChange">更改count</button><button @click="dispatchChange">更改count</button>...methods:{ commitChange(){ this.$store.commit('change',1); }, dispatchChange(){ this.$sotre.dispatch('change',10); }}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答