具有多个模块的 vuex 命名空间 mapState

Posted

技术标签:

【中文标题】具有多个模块的 vuex 命名空间 mapState【英文标题】:vuex namespaced mapState with multiple modules 【发布时间】:2018-01-17 13:17:32 【问题描述】:

我一定错过了什么。如何将 vuex mapState 与多个模块一起使用?

据了解,除了将对象作为参数传递之外,命名空间的 mapState 还可以接受两个参数:命名空间和表示模块成员的对象名称数组。像这样

// an imcomplete vue
export default 
   computed: mapState('user', ['addresses', 'creditCards']) 
;

但是如果我想将来自第二个命名空间的对象添加到计算中呢?例如像这样的供应商:

mapState('vendor', ['products', 'ratings']) 

目前我正在像这样合并两个 mapState:

let userMapState = mapState('user', ['addresses', 'creditCards']); 
let vendorMapState = mapState ('vendor', ['products', 'ratings']);
let mergedMapStates = Object.assign(, userMapState, vendorMapState);

然后:

// an imcomplete vue
export default 
    computed: mergedMapStates
;

它有效,但它几乎不是正确的方法。还是这样?

【问题讨论】:

【参考方案1】:

使用spread operator:

computed: 
  ...mapState('user', ['addresses', 'creditCards']),
  ...mapState('vendor', ['products', 'ratings']) 

【讨论】:

我将这三个点误读为文档中的省略号。我还没有习惯传播运算符。 有效!谢谢!! 是的,但是如何从组件中引用地址? @MichealJ.Roberts 像任何其他数据一样,例如 addresses <div v-for="address in addresses">【参考方案2】:

这是来自 vuex 文档,您可以在一个 ...mapState() 中完成所有操作。 Documentation

computed: 
  ...mapState(
    a: state => state.some.nested.module.a,
    b: state => state.some.nested.module.b
  )
,

编辑 2019

您还可以传递嵌套模块的路径并使模块引用更清晰(感谢@gijswijs)

computed: 
  ...mapState('some/nested/module', 
    a: state => state.a,
    b: state => state.b
  )
,

【讨论】:

文档(现在)明确指出,这种做事方式“可能会有点冗长”,因此下面解释的替代方法是“将模块命名空间字符串作为第一个参数传递给帮助器,以便使用该模块作为上下文完成所有绑定”【参考方案3】:

如果你没有太多的命名空间,你可以试试这个:

    ...mapState(
      userAddresses: 'user/addresses',
      userCreditCards: 'user/creditCards'

      vendorProducts: 'vendor/products',
      vendorRatings: 'vendor/ratings',          
    ) 

【讨论】:

这至少不适用于 Nuxt 2.15 或更低版本【参考方案4】:

您也可以像这样使用 Object.assign。与您当前的解决方案类似,但更简洁。

    computed: Object.assign(
        mapState('user', ['addresses', 'creditCards']),
        mapState('vendor', ['products', 'ratings']
    )

【讨论】:

【参考方案5】:

利用扩展运算符访问多个模块状态值

 ...mapState('user', 
     isLoggedIn: ( activeUser ) => !!activeUser?.id
  ),
   ...mapState('quizzes', ['getCategories'])

【讨论】:

以上是关于具有多个模块的 vuex 命名空间 mapState的主要内容,如果未能解决你的问题,请参考以下文章

Vuex模块:开启命名空间

vuex中module的命名空间概念

vuex中的模块化(modules)和命名空间(namespaced),以及四个辅助函数

循环遍历 Vuejs 中的 mapstate 计算属性

Vue之Vuex的使用

Vuex:具有动态命名空间的 createNamespacedHelpers