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条经验 获得超12个赞
您的最后一个代码块因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)
}
}
...
添加回答
举报