【问题标题】:How do I enable namespacing on an imported VueX module?如何在导入的 VueX 模块上启用命名空间?
【发布时间】:2022-01-30 06:45:41
【问题描述】:

我正在使用帮助文件来导入 VueX 模块:

const requireModule = require.context('.', false,  /\.store\.js$/)
const modules = {}

requireModule.keys().forEach(filename => {
    const moduleName = filename
                   .replace(/(\.\/|\.store\.js)/g, '')
                   .replace(/^\w/, c => c.toUpperCase())
    modules[moduleName] = requireModule(filename).default || requireModule(filename)
})

export default modules

这存在于@/store/modules/index.js 并由@/store/index.js 导入:

import Vue from 'vue'
import Vuex from 'vuex'
import modules from './modules'

Vue.use(Vuex)
export default new Vuex.Store({
  modules,
  actions: {
    reset({commit}) {
      Object.keys(modules).forEach(moduleName => {
        commit(`${moduleName}/RESET`);
      })
    }
  }
})

导入到 Vue:@/main.js:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

适用于我所有的商店模块!每个都有命名空间:

const initialState = () => ({})
const state = initialState()
const mutations = {
  RESET(state) {
    const newState = initialState();
    Object.keys(newState).forEach(key => {
          state[key] = newState[key]
    });
  }
} 
const getters = {}
const actions = {}

export default {
    namespaced: true,
    state,
    getters,
    actions,
    mutations
}

现在,我正在尝试将包作为状态模块导入。我没有任何经验。这可能看起来很傻......但我不确定如何将命名空间启用注入到 @/store/modules/Auth.store.js 中的包导入中:

import AmazonCognitoVuexModule from 'amazon-cognito-vuex-module';

const cognito = new AmazonCognitoVuexModule({
  region: process.env.VUE_APP_COGNITO_REGION,
  userPoolId: process.env.VUE_APP_COGNITO_USERPOOL_ID,
  clientId: process.env.VUE_APP_COGNITO_CLIENT_ID,
})

export default cognito

因此,当我尝试使用 $store.dispatch('Auth/...') 调用导入的商店模块的操作时,找不到它们...因为它们没有命名空间。我想命名这个模块“Auth”。我敢打赌我忽略了一些非常简单的事情。任何帮助表示赞赏。

【问题讨论】:

    标签: javascript vue.js namespaces vuex


    【解决方案1】:

    我的第一次尝试是(基于 NPM 上这个包的文档):

    // source: https://www.npmjs.com/package/amazon-cognito-vuex-module
    const store = new Vuex.Store({
      modules: {
        cognito: new AmazonCognitoVuexModule({
          region: '<region>',
          userPoolId: '<user pool id>',
          clientId: '<client id>'
        })
      }
    });
    

    上面的代码显示您可以将其作为模块导入(他们将其命名为cognito,您想要auth - 这应该没有区别;我使用官方文档中的命名)。所以你需要更新你的代码,像这样:

    import Vue from 'vue'
    import Vuex from 'vuex'
    import modules from './modules'
    import cognito from './path/to/cognito'
    
    Vue.use(Vuex)
    export default new Vuex.Store({
      modules: {
        ...modules,
        cognito,
      },
      actions: {
        reset({commit}) {
          Object.keys(modules).forEach(moduleName => {
            commit(`${moduleName}/RESET`);
          })
        }
      }
    })
    

    我不确定这是否有效,但这是我的第一次尝试 :)

    【讨论】:

    • 感谢您的回复。并不是我无法导入 store 模块。使用导入助手,它可以作为一个单独的文件正常工作。您的回答似乎只是消除了……我不想这样做。我需要帮助的是在导入的商店上启用命名空间属性。包文档没有描述如何传递该值。
    • @robwolf.io 是的 - 但如果 cognito 是像其他模块一样的模块,那么您可以 export default { ...cognito, namespaced: true }。至少尝试一下是否可行。或者试试cognito.namespaced: trueexport
    猜你喜欢
    • 2020-07-14
    • 2021-02-17
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多