如何为 Vue 中组件的每个初始化实例创建独立的 Vuex 状态?

How to create isolated Vuex states for every initialized instance of a component in Vue?

我是 Vue 新手。

我看到有人建议我们需要为组件使用 Vuex 模块来存储它们的状态数据,以便我们可以在父组件中访问该数据。

例如,我有 MarkdownEditor.vue 组件,我需要从父组件访问它的数据。我将状态存储在 Vuex 模块中,例如 markdownEditorStore.js... 我可以轻松地在父组件中访问此状态,例如 this.$store.state.markdownEditor.XYZ.

没关系。但是,如果我有 n 个 MarkdownEditor 组件并且每个组件都需要隔离状态怎么办?这是一个非常基本的问题,但我该如何处理呢?

我需要一个基于模块实例的解决方案,而不是基于模块的解决方案。

我从你的问题中了解到,你希望每个组件都有一个单独的状态,你可以通过创建一个带有 namespace=true 的单独模块来实现 对于每个组件 https://vuex.vuejs.org/guide/modules.html#namespacing

模块特性是在不同域之间拆分逻辑(在您的情况下,编辑器是一个模块)。不适用于实例本身。

经验法则是,将与 Vuex 存储连接的父级向下传递给 MarkdownEditor.vue 加载所需的数据。理想情况下,MarkdownEditor 能够只加载从父级接收到的道具。这是将视觉与状态分开的好做法。更容易测试和清晰的组件 API.

即使您有 N 个可能的 ME(MarkdownEditor) 实例,您要么一次显示一个,要么显示多个。对于这两种情况,您都可以拥有一个 MarkdownEditorDataStore 来保存所有需要的数据。

然后您只需要为每个 ME 实例访问正确的数据。这取决于您的商店和组件结构。我能想到的两种方法是,要么你有一个像 editors: [ { id: 1, title: X}, { id: 2, title: Y } ] 这样的 N ME 实例的数组,要么有一个包含所有数据的对象 { editors: { 1: {id: 1, title: X }, 2: { id: 2, title: Y } }.

要么通过this.$store.state.MarkdownEditorDataStore.editors[myID]获取数据 要么 this.$store.state.MarkdownEditorDataStore.editors.find(id => myID === id)

你可以有一个数据 属性 保存 currentEditorId 以防你一次只显示一个实例。在这种情况下最好使用 getter 来显示 actualCurrentEditorObject.