【问题标题】:Pass state property via props (Vuex)通过道具传递状态属性(Vuex)
【发布时间】:2017-08-17 11:47:11
【问题描述】:

我有一个组件应该显示来自 store 的数据,但该组件是可重用的,所以我想通过 props 传递 store 模块的名称和属性名称,如下所示:

<thingy module="module1" section="person">

那么,在组件中:

<template>
  <h2>{{ title }}</h2>
  <p>{{ message }}</p>
</template>

<script>
import { mapState } from 'vuex';
import get from 'lodash.get';

export default {
  props: [
    'module',
    'section',
  ],
  computed: mapState(this.module, {
    title: state => get(state, `${this.section}.title`),
    message: state => get(state, `${this.section}.message`),
  })
}
</script>

问题是,在执行mapState() 时似乎未定义道具。如果我对 prop 值进行硬编码,则该组件可以工作。此外,如果我在 created() 钩子中记录道具,我会得到预期值。所以这似乎是一个竞争条件。

我在这里做错了吗?

更新

模块命名空间必须从映射函数中传递,如下所示:

computed: mapState({
  title() {
    return get(this.$store.state, `${this.module}.${this.section}.title`);
  },
  message() {
    return get(this.$store.state, `${this.module}.${this.section}.message`);
  }
})

(注意get()是lodash,不是vue函数)

这可以进一步抽象成一个mixin。

【问题讨论】:

    标签: javascript vue.js vue-component vuex vue-props


    【解决方案1】:

    注意mapState example中的评论:

    // to access local state with `this`, a normal function must be used
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
    

    您正在使用箭头函数。

    至于this.module,我认为您将不得不放弃binding helper notation 并明确地将模块引用放入定义中。我猜这看起来像:

    computed: mapState(this.module, {
      title(state) {
        return get(`${state}.${this.module}`, `${this.section}.title`);
      },
      message(state) {
        return get(`${state}.${this.module}`, `${this.section}.message`);
      }
    })
    

    【讨论】:

    • 错过了,谢谢。现在我只需要能够在mapState() 调用中访问this.module。有什么想法吗?
    • 我现在就是这样做的,但是对于我正在处理的应用程序的大小,它会变得非常冗长:( thx 不管怎样
    • 再想一想,当然this.module 也可以在绑定助手中使用,只是不如只提供一次方便。用解决方案更新了我的问题。再次感谢您指出。
    猜你喜欢
    • 2018-04-14
    • 2019-12-14
    • 2023-03-15
    • 2017-08-22
    • 1970-01-01
    • 2017-08-10
    • 2018-11-04
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多