Vuex 是個處理全域資料的狀態管理庫,採集中式管理方式,方便任何元件都能從中獲取狀態或觸發事件,實作上通常用來存儲 API 資料後再加以應用,尤其適合應用於開發中大型專案。
一圖以蔽之:
(圖片來源:Vuex - What is Vuex?)
Vuex 主要以四個核心概念——State、Getters、Mutations、Actions——所組成,另外包含 Modules 可再進行模組化。依循圖片的運行流程大致如下:
原則上整個流程為單向循環,不可逆向,盡量避免越級(若遇處理同步或非同步問題時,也會有略過 action 直接呼叫 mutation 的情形發生)。
處理非同步執行程序
需透過提交 mutation 才能改變 state
使用 dispatch
呼叫 action:回傳值為 promisedispatch(type: string, payload?: any, options?: Object): Promise<any>
store.dispatch('fetchBookList', amount: 10)
action 函式第一個參數為 context,第二個可選參數為 payload
context 物件包含:state、rootState、commit、dispatch、getters、rootGetters
actions: {
fetchBookList (context) {
context.commit('bookList', books) // 相當於 store.commit()
}
}
可利用 ES6 參數解構(argument destructuring)簡化程式碼:
actions: {
fetchBookList ({ commit }) {
commit('bookList', books) // 相當於 store.commit()
}
}
處理同步執行程序
唯一可以改變 state 的方法,且單純只將結果直送並賦值給 state
使用 commit
呼叫 mutationcommit(type: string, payload?: any, options?: Object)
store.commit('bookList', books)
mutation 函式第一個參數為 state,第二個可選參數為 payload
mutations: {
bookList(state, books) {
state.bookList = books;
},
},
第三個可選參數(options?: Object
)若設定為 { root: true }
,便能取得命名模組(namespaced modules)中的 root actions 或 root mutations。
payload
作為額外參數,通常會使用物件型別以包含多組資料而易於閱讀;
若是以物件形式呼叫 commit/dispatch,則整個物件會作為 payload
傳遞給 mutation/action
store.commit({
type: 'bookList',
data: books
})
mutations: {
bookList(state, payload) {
state.bookList = payload.data;
},
}