【发布时间】:2020-09-23 18:09:06
【问题描述】:
假设我有一个 Vuex 状态,其中包含我想在组件中改变的对象数组。我遍历数组并为每个将对象作为道具的对象生成一个组件。在组件内部,我调用 Vuex 突变,并将 Object 作为直接参数传递下来。例如:
父母
<template>
<ItemComponent
v-for="(item, index) in items"
:key="index"
:index="index"
:item="item"
/>
</template>
<script>
import ItemComponent from 'ItemComponent.vue';
export default {
components: {
ItemComponent
},
computed: {
items() {
return this.$store.getters.items;
}
}
};
</script>
孩子:
<template>
</template>
<script>
export default {
props: {
item: {
type: Object,
required: true
}
},
methods: {
changeItemProp() {
this.$store.dispatch('changeItemXValue', {this.item, 'newValue'});
}
}
};
</script>
商店:
// ...
mutations: {
changeItemXValue(state, { item, value }) {
item.x = value
}
}
它有效,是的。但我很确定这是一个反模式,对吧?
// ...
mutations: {
changeItemXValue(state, { item, value }) {
state.items.find((i) => i === item).x = value
}
}
这似乎也好不了多少。
我的问题:如果我想将我的可变数据封装在一个子组件中,这是要走的路,还是这被认为是一种反模式?在这种情况下,我想知道处理这种情况的正确方法是什么。我最初准备 vuex 来处理这种情况,但我不确定这是否是正确的方法。谢谢。
【问题讨论】:
-
不是将项目本身传递给突变,而是传递项目 ID(例如,它的索引)。然后你的突变可以查找项目(也可能比
find更高效)来设置它的值。
标签: javascript vue.js vuejs2 vue-component vuex