我正在将Vue集成到表单站点上,这意味着如果页面上有多个表单,则必须创建该Vue应用程序的多个实例。所有实例共享同一Vuex存储。
我创建了一个Vuex模块,以便每个Vue实例都可以拥有自己的本地状态。 我的主要目标是防止一个Vue实例更新另一个Vue实例的状态。
这是我的Vuex模块
export default {
state() {
return {
stateObj: {...}
}
}
}
创建我的Vuex实例:
export default new Vuex.Store({
modules: {
form
}
})
我正在阅读Vuex文档,它说您需要使用一个返回模块状态的函数,这就是我正在做的事情。但是,当我在一个Vue实例中更新模块的状态时,它将更新所有其他Vue实例的模块状态。
答案 0 :(得分:4)
发生这种情况的原因是您并未真正创建form
模块或商店的多个实例。本质上,您正在创建Vue应用程序的多个实例,也就是说,您具有多个 Root Vue实例。
但是,您的商店代码清楚地表明您正在通过导出类似export default new Vuex.Store({ /**/ }).
如果您有多个根实例,即多个Vue应用程序,则需要 Vuex存储的多个实例。您的代码将类似于:
// store.js - Note: Do not return singleton store
export default makeStore() {
return new Vuex.Store({
modules: { form }
});
}
// main.js/root.js
import makeStore from './store.js';
// Creating multiple instances of root instance and Vuex store.
const app1 = new Vue({ store: makeStore() });
const app2 = new Vue({ store: makeStore() });
这应该可以解决您的问题。尽管这种设计并不少见,但您仍应退后一步思考-如果需要在所有这些应用程序之间共享数据该怎么办?由于存在多个实例,因此您无法轻松做到这一点。只要所有这些形式都可以独立工作,就可以了。
或者,如果您必须真正制作单个商店,那么可以考虑更改商店设计。您应该有一个根实例/应用程序,并使用v-for
生成多个表单。同样,在商店方面,您将有一个数组来维护所有表单的集合。