需要多个Vue实例的多个Vuex模块实例

时间:2019-03-21 00:45:09

标签: vue.js vuex vuex-modules

我正在将Vue集成到表单站点上,这意味着如果页面上有多个表单,则必须创建该Vue应用程序的多个实例。所有实例共享同一Vuex存储。

我创建了一个Vuex模块,以便每个Vue实例都可以拥有自己的本地状态。 我的主要目标是防止一个Vue实例更新另一个Vue实例的状态。

这是我的Vuex模块

export default {
  state() {
    return {
      stateObj: {...}
    }
  }
}

创建我的Vuex实例:

export default new Vuex.Store({
  modules: {
    form
  }
})

我正在阅读Vuex文档,它说您需要使用一个返回模块状态的函数,这就是我正在做的事情。但是,当我在一个Vue实例中更新模块的状态时,它将更新所有其他Vue实例的模块状态。

这里是我所指的Vuex文档中的enter image description here

1 个答案:

答案 0 :(得分:4)

发生这种情况的原因是您并未真正创建form模块或商店的多个实例。本质上,您正在创建Vue应用程序的多个实例,也就是说,您具有多个 Root Vue实例

但是,您的商店代码清楚地表明您正在通过导出类似export default new Vuex.Store({ /**/ }).

的实例来创建Vuex商店的单个实例。

如果您有多个根实例,即多个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生成多个表单。同样,在商店方面,您将有一个数组来维护所有表单的集合。