在理解Vuex資料流後,還有幾個重點需要提醒,而在這裡想要介紹的是字串管理及命名空間。在前面介紹的Vuex中,actions與mutations的名稱本質上都屬於字串。如果各個不同的程式碼,如組件、模組物件都直接用硬編碼字串,如:
this.$store.dispatch('fetchEmployees', payload);
commit('setEmployees', data)
可能會有諸多問題,即若其中有一個名稱打字打錯時,不容易被發現,使得編譯錯誤,無法發揮既有功能。此外,當要修改該名稱時,也會顯得維護困難,需針對每個名稱進行修改。此問題尤其在涉及跨檔案管理時,更顯得難於管理,即散落在各檔案的名稱,很難馬上對照到它的定義位置。
因此解決辦法,就是字串管理,也就是將字串統一放在某一個檔案中,統一定義、一同管理。在Vuex中,actions和mutations分別有其對應的字串管理檔案,分別放置於src/store/actions.type.js
及src/store/mutations.type.js
。
// src/store/actions.type.js
// Employee
export const FETCH_EMPLOYEES = "fetchEmployees";
export const FETCH_EMPLOYEE = "fetchEmployee";
export const CREATE_EMPLOYEE = "createEmployee";
export const UPDATE_EMPLOYEE = "updateEmployee";
export const DELETE_EMPLOYEE = "deleteEmployee";
// src/store/mutations.type.js
export const SET_LOADING = "SET_LOADING";
// Employee
export const SET_EMPLOYEES = "setEmployees";
export const SET_EMPLOYEE_COUNT = "setEmployeeCount";
export const SET_NEXT_URL = "setNextUrl";
export const SET_PREV_URL = "setPrevUrl";
export const SET_CURRENT_PAGE = "setCurrentPage";
也因為將所有會用到的actions及mutations都放在同一個檔案,因此只要針對檔案中,各字串的內容進行修改,即可同步修改有使用到該字串名稱的檔案,管理上變得相當方便。且各字串名稱的定義內容,也可以一目瞭然地從這個檔案中找尋到。
未來在使用呼叫時,只要參考以下程式碼的語法,即可順利完成呼叫。
// 呼叫actions
import { FETCH_EMPLOYEES } from "@/store/actions.type";
this.$store.dispatch(`employee/${FETCH_EMPLOYEES}`, {
page: this.currentPage,
page_size: this.pageSize
});
// 呼叫mutations
import { SET_EMPLOYEES } from "@/store/mutations.type";
this.$store.commit(`employee/${SET_CURRENT_PAGE}`, newPage);
此外,可以注意到前面Vuex模組在匯出全域環境前,有設定namespaced: true
,此即所謂的命名空間(namespace)。
export default {
namespaced: true,
state,
actions,
mutations,
getters
};
代表在呼叫或抓取更新狀態時,需要加上employee/
前綴,如:
this.$store.dispatch('employee/FETCH_EMPLOYEES', ...)
this.$store.commit('employee/SET_LOADING', ...)
mapGetters('employee', [...])
如此才抓得到正確已更新的狀態,並可以避免不同模組可能使用相同名稱的狀態,而導致名稱衝突。這在開發後期,增加越來越多功能的情況下,越能顯現其必要性,因此建議在一開始就建立設定命名空間的習慣,除了方便管理,也可以減少需要除錯的空間。