2 回答

TA貢獻1803條經驗 獲得超3個贊
好的,所以您有兩個模塊。一個具有從服務器獲取的狀態,另一個具有依賴于第一個的狀態,對嗎?
我建議采用以下方法:
首先,將模塊設置為空的“狀態”。然后在accountModule中創建一個操作,以設置服務器的狀態。使用吸氣劑對other列表進行排序。最后,在創建應用程序時分派您的操作。
const account = {
namespaced: true,
state: {
listOrder: ''
},
mutations: {
setListOrder (state, newListOrder) {
state.listOrder = newListOrder
}
},
actions: {
async fetchServerState (ctx) {
let result = await fetch("/path/to/server")
ctx.commit('setListOrder', result.listOrder)
// or whatever your response is, this is an example
}
}
}
const other = {
namespaced: true,
state: {
unorderedList: []
},
getters: {
list (state, getters, rootState) {
return someSort(state.unorderedList, rootState.account.listOrder);
}
}
}
在App.vue中(或任何地方)
created () {
this.$store.dispatch('account/fetchServerState')
}

TA貢獻1842條經驗 獲得超13個贊
您的最后一個代碼塊因await必須在內部async函數而無法正常工作。
請記住,await關鍵字僅在異步函數內有效。如果在異步函數的主體之外使用它,則會收到一個SyntaxError。
來自MDN。
您可以使用動態模塊注冊:
accountModulePromise.then(async () => {
let otherModule = await import('@/store/modules/other/other');
store.registerModule('other', otherModule.default);
});
但是,當您要獲取狀態或調度動作時,必須檢查模塊是否已注冊,這是非常糟糕的。
我認為,如果重新設計模塊結構以使彼此解耦,那會更好。嘗試將您的初始化代碼移至其中,main.js或App.vue然后分派操作以從中更新模塊狀態。
更新
從您的上一次更新到將商店解耦的另一種想法,我認為您應該存儲list沒有訂單的商品,并僅在使用時對其進行排序。您可以使用以下方法執行此操作:
計算屬性:
...
computed: {
list () {
let list = this.$store.state.other.list
let order = this.$store.state.account.settings.listOrder
if (!list || !order) return []
return someSort(list, order)
}
},
beforeCreate () {
this.$store.dispatch('other/fetchList')
this.$store.dispatch('account/fetchListOrder')
}
...
或Vuex吸氣劑:
...
getters: {
list: (state) => (order) => {
return someSort(state.list, order)
}
}
...
...
computed: {
list () {
let order = this.$store.state.account.settings.listOrder
return this.$store.getters['others/list'](order)
}
}
...
添加回答
舉報