You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vuex模块间复用state字段、actions及mutations?

Vuex多模块复用独立状态、Actions及Mutations的最佳实践

针对你需要在多个Vuex模块间复用一组状态字段、Actions和Mutations,同时保证各模块字段独立不共享值的需求,最符合DRY原则的方案是使用模块工厂函数,具体实现如下:

1. 创建可复用的共享模块工厂

编写一个工厂函数,每次调用都会返回全新的共享模块配置,确保每个业务模块拿到的state都是独立对象:

// sharedModuleFactory.js
export default function createSharedModule() {
  return {
    state: {
      sharedFieldOne: '',
      sharedFieldTwo: 0
    },
    actions: {
      setSharedFieldOne({ commit }, value) {
        commit('SET_SHARED_FIELD_ONE', value);
      },
      setSharedFieldTwo({ commit }, value) {
        commit('SET_SHARED_FIELD_TWO', value);
      }
    },
    mutations: {
      SET_SHARED_FIELD_ONE(state, value) {
        state.sharedFieldOne = value;
      },
      SET_SHARED_FIELD_TWO(state, value) {
        state.sharedFieldTwo = value;
      }
    }
  };
}

2. 在业务模块中合并共享配置

在Todos、Heroes等业务模块里,调用工厂函数生成共享模块,再通过对象展开运算符将共享的state、actions、mutations合并到当前模块中:

TodosModule.js

import createSharedModule from './sharedModuleFactory';

const sharedModule = createSharedModule();

export default {
  state: {
    todos: [],
    ...sharedModule.state // 合并共享状态字段
  },
  actions: {
    async saveTodos({ state }) {
      await this.Api.saveTodos({
        todos: state.todos,
        sharedFieldOne: state.sharedFieldOne,
        sharedFieldTwo: state.sharedFieldTwo
      });
    },
    setTodos({ commit }, newTodos) {
      commit('SET_TODOS', newTodos);
    },
    ...sharedModule.actions // 合并共享Actions
  },
  mutations: {
    SET_TODOS(state, newTodos) {
      Vue.set(state, 'todos', newTodos);
    },
    ...sharedModule.mutations // 合并共享Mutations
  }
};

HeroesModule.js

import createSharedModule from './sharedModuleFactory';

const sharedModule = createSharedModule();

export default {
  state: {
    heroes: [],
    ...sharedModule.state
  },
  actions: {
    async saveHeroes({ state }) {
      await this.Api.saveHeroes({
        heroes: state.heroes,
        sharedFieldOne: state.sharedFieldOne,
        sharedFieldTwo: state.sharedFieldTwo
      });
    },
    setHeroes({ commit }, newHeroes) {
      commit('SET_HEROES', newHeroes);
    },
    ...sharedModule.actions
  },
  mutations: {
    SET_HEROES(state, newHeroes) {
      Vue.set(state, 'heroes', newHeroes);
    },
    ...sharedModule.mutations
  }
};

方案优势

  • 状态独立:工厂函数每次返回全新的state对象,各业务模块的共享字段值完全独立,修改一个模块的字段不会影响其他模块;
  • 符合DRY原则:共享的逻辑只需要维护一次,所有业务模块直接复用;
  • 适配API架构:共享字段直接存在业务模块的state中,API调用时无需跨模块引用,完全匹配你现有模块与API耦合的架构。

你提到的Vuex文档中模块复用方案,是直接复用同一个模块对象导致状态共享,而工厂函数通过每次创建新实例完美解决了这个问题。

内容的提问来源于stack exchange,提问作者Zach Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:05:33