我有一个组件应该显示来自商店的数据,但该组件是可重用的,所以我想通过道具传递商店模块的名称和属性名称,如下所示:
<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。