今天要介紹的是 modules 內的 namespaced。
前一章有提到我要去取得其他 module 的 state 及 getters 我們要使用 rootState 及 rootGetters,那如果我要使用其他 module 裡面的 mutation 及 actions 呢?!
這時我們就需要在 module 裡面加上 namespaced 囉,使用 namespaced 也能夠提高 module 的封裝度和複用性,所有 getter 、 action 及 mutation 都會自動根據 module 註冊的路徑調整命名。
這樣說可能很抽象,下面就用範例來解說唄~
沿用前一章的範例,我想要從 cart 去呼叫 product 的 mutations 及 actions 的話該如何執行,如下:
如上面所說,我將 module 內設定 namespaced: true
,這樣就能呼叫其他 module 的 actions 及 mutations
const cart = {
namespaced: true,
state: {
cartList: []
},
actions: {
getList({commit, dispath, state, getters, rootState, rootGetters}) {
commit('product/setList', payload, {root: true})
//commit 及 dispath 沒有提供像 rootstate 及 rootGetters 的方法
//所以使用 namespaced 時在最後面加上 root: true
//來讓這個 actions 可以呼叫其他的 mutations 及 actions
}
}
}
const product = {
namespaced: true,
state: {
productList: []
},
mutations: {
setList(state, payload) {
state.productList.push(...payload)
}
}
}
另外一種情況是,我有可能在不同的 module 裡面的 actions 或 mutations 命名是一樣的,我們也能透過 namespaced 來明確的指定我們是要使用哪個 module 裡面的 actions 及 mutations。
const cart = {
namespaced: true,
state: {
cartList: []
},
actions: {
getList({commit, dispath, state, getters, rootState, rootGetters}) {
xxxxxxx
}
}
}
const product = {
namespaced: true,
state: {
productList: []
},
actions: {
getList({commit, dispath, state, getters, rootState, rootGetters}) {
xxxxxxxx
}
}
}
我們在 Vue 裡面就能透過以下方式來明確指定我是要哪個 actions:
this.$store.dispath('cart/getList');
this.$store.dispath('product/getList');
以上就是 Vuex 裡的 namespaced 囉~