我有一个组件应该显示来自商店的数据,但该组件是可重用的,所以我想通过props传递商店模块和属性名称的名称,如下所示:
<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。
答案 0 :(得分:3)
请注意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`);
}
})