【问题标题】:Need multiple instances of Vuex module for multiple Vue instances多个 Vue 实例需要多个 Vuex 模块实例
【发布时间】:2019-03-21 00:45:09
【问题描述】:

我正在将 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 文档中的 section

【问题讨论】:

  • 你在哪里重复使用那个模块?你只用过一次form
  • @Phil 我在每个 Vue 实例的存储中传递表单

标签: vue.js vuex vuex-modules


【解决方案1】:

发生这种情况的原因是您并没有真正创建form 模块或商店的多个实例。您实际上是在创建多个 Vue 应用程序实例,即您有多个 Root Vue 实例

但是,您的商店代码清楚地表明您正在通过导出如下实例来创建 Vuex 商店的单个实例:export default new Vuex.Store({ /**/ }).

如果您有多个根实例,即多个 Vue 应用程序,那么您需要 Vuex Store 的多个实例。您的代码将类似于:

// store.js - Note: Do not return singleton store
export default function 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 生成多个表单。同样,在商店方面,您将有一个数组来维护所有表单的集合。

【讨论】:

  • 谢谢!绝对是有道理的,我让它工作。一个问题是,为什么我仍然将我的state 设置为一个函数,它在我的store 中返回一些东西?我想既然它们现在是单独的实例,就不需要为state使用函数?
  • @bhood,确实,您不需要函数。只需确保为每个实例创建了新的 form。否则,即使你声明为一个函数,你也可能返回一个共享对象,导致同样的问题。
  • @HarshalPatil export default function makeStore() { }; function 这里需要语法。 mdn exportexport usage
  • 注意使用多个vuex实例可能会出问题,见this issue
  • @HarshalPatil 你有更多关于这方面的例子吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2017-11-13
  • 2017-05-05
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多