Vue.js 以特定方式自动注册 Vuex 模块

标签 vue.js vuex vuex-modules

我刚开始使用 Vue.js,我正在尝试使用 Vuex。我的目录中有以下结构:src/store/

store
├── index.js
└── modules
    ├── app
    │   └── index.js
    └── auth
        └── index.js


在每个模块中,我只有一个名为 index.js 的文件。 , 在这些文件中我定义了 getters, actions, mutations, etc每个模块的。

我的问题如下:如何在 src/store/index.js 中自动注册所有这些模块?文件,无需一一注册。随着我的应用程序的增长,这将成为一项乏味的任务。我还需要在这些模块中的每一个自注册时,自定义属性namespaced: true
到目前为止我已经尝试过:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const context = require.context('./modules', true, /index.js/); //only files with the name index.js

const modules = context.keys()
  .map(file => [file.replace(/(^.\/)|(\.js$)/g, ''), context(file)])
  .reduce((modules, [name, module]) => {
    if (module.namespaced === undefined) {
      module.namespaced = true;
    }

    return { ...modules, [name]: module };
  }, {});

const store = new Vuex.Store({
  modules: modules
});

export default store;


非常感谢您提前。

最佳答案

据我所知,问题在于使用 context(file) 映射模块。 .对于默认导出,我已成功使用 context(file).default , 依靠 context(file)如果那是未定义的。我也没有看到你剥离 '/index'文件目录路径的一部分。
恕我直言,使用reduce会使代码比它需要的更复杂。您可以使用 forEach 方法轻松地做到这一点:

const context = require.context('./modules', true, /index.js/);
const modules = {};

context.keys().forEach((file) => {

  // create the module name from file
  const moduleName = file.replace(/(\.\/|\/index\.js$)/g, '');

  // register file context under module name
  modules[moduleName] = context(file).default || context(file);

  // override namespaced option
  modules[moduleName].namespaced = true;
});

const store = new Vuex.Store({
  modules, // ES6 shorthand for modules: modules
})

export default store;

关于Vue.js 以特定方式自动注册 Vuex 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61093836/

相关文章:

javascript - 在某些情况下无法重置属性,vue.js

javascript - Vuejs - 在同一组件中获取不同的日期

javascript - vuex 注册模块中的未知突变类型

vue.js - 如何从 vue js 中的登录组件更新用户状态?

vue.js - NuxtServerInit 无法在 Vuex 模块模式下工作 - Nuxt.js

vue.js - 从 JS 文件访问 Nuxt 存储(在模块模式下)

javascript - 获取钩子(Hook)和 NuxtLoading 组件

javascript - Python 字典/json 重复键

javascript - 使用子组件的 $emit 将数据发送到父组件不适用于 Vue

vue.js - 动态注册一个 Vuex 插件?