【问题标题】:Splitting Vuex module into multiple files in the same namespace将 Vuex 模块拆分为同一命名空间中的多个文件
【发布时间】:2023-03-14 13:55:02
【问题描述】:

我正在尝试将我的 Vuex 模块拆分为多个块。除了创建多个命名空间模块(namespaced: true)之外,我还想扩展变得非常长的全局模块。似乎在某些情况下,最好将我的一些操作/突变保留在全局模块中,因为它们相互通信并且过于耦合,但每次我需要执行操作或突变时使用{ root: true } 选项在我看来感觉不够好。因此,就我而言,不将 namespaced 设置为 true 听起来是完美的解决方案。

但是……

首先 - 似乎没有命名空间的模块不能拥有自己的state。 此外 - 当他们尝试使用 state 传递给动作/突变时,他们失败了,因为他们无法直接与根状态通信(仅使用 rootState 参数,这不是我所期望的)。

我能想到的另一种可能的解决方案是像这样初始化我的 Vuex 商店:

export default new Vuex.Store({
  namespaced: true,
  state: {},
  getters: {},
  mutations: {},
  actions: {
    ...actionsFromFile1,
    ...actionsFromFile2
  }
});

但这个解决方案似乎还不是最好的。我还缺少其他解决方案吗?

【问题讨论】:

    标签: javascript vue.js vuex store


    【解决方案1】:

    您可以为单独的模块使用单独的文件:https://vuex.vuejs.org/guide/structure.html

    【讨论】:

      【解决方案2】:

      你应该在你的模块中保留你的动作和突变。

      正如您所提到的,您可以使用root 来调度其他模块的操作。 为什么要使用它,很简单。可见性 - 如果您需要从另一个存储中调度操作,请将其保存在您期望的模块中,将代码拆分到您的全局存储和模块中将很难跟踪事物的来源。

      此外,您的全球商店将会增长,您以后将很难找到想要的东西。

      简单示例:

      // message.js
      
      const actions = {
        add({ dispatch }, message) {
          dispatch("chat/initializeChat", {}, { root: true });
      
          // add message or something
        },
      };
      

      【讨论】:

      • 但关键是我不想将一些动作移动到另一个模块,因为它们都相互通信。在这种情况下,使用 { root: true } 并不是最好的解决方案。它与任何其他项目结构一样,您希望将文件拆分为较小的文件以防文件太长,并且拆分不一定意味着将其移动到不同的模块。
      • 如果您想保留您的结构,您需要将您的全局存储功能拆分为更小的文件,导入它们并按照您提供的示例使用它们。我仍然不会推荐它:D
      • 我仍然试图弄清楚他们相互交流的意思是什么?能给我举个例子吗。 :D
      • 是的。 actionfile1 有一个名为 action1 的动作,而 actionfile2 有一个名为 action2 的动作。 action1 调度一个动作,它(比方说)初始化一个事件监听器。此事件侦听器在触发时从文件 1 调度一个操作。它以两种方式绑定,但孩子与父母的沟通在编程中是一种不好的做法,因此拆分为模块对我没有帮助。
      • 所以你有这样的东西吗? action1(file1) -> action1(file2) -> action2(file1) 把它放到模块中并不是一个坏习惯,因为你会知道在哪里完成了模块存储本身以及当另一个模块被调用和使用/更改时。此信息适用于任何其他开发人员,例如将在您的实施中丢失。
      猜你喜欢
      • 2015-10-04
      • 2011-06-09
      • 2011-07-06
      • 2018-01-17
      • 1970-01-01
      • 2020-07-14
      • 2021-02-17
      相关资源
      最近更新 更多