【发布时间】:2019-12-31 02:44:44
【问题描述】:
在此参考现场演示代码:
https://codesandbox.io/s/vue-template-r26tg
假设我有一个包含以下数据的 Vuex 商店:
const store = new Vuex.Store({
state: {
categories: [
{
name: "Category A",
items: [{ name: "Item 1" }, { name: "Item 2" }, { name: "Item 3" }]
},
{
name: "Category B",
items: [{ name: "Item A" }, { name: "Item B" }, { name: "Item C" }]
},
{
name: "Category C",
items: [{ name: "Item !" }, { name: "Item @" }, { name: "Item #" }]
}
]
}
});
我有一个 App.vue、Category.vue 和 Item.vue,它们的设置是这样的:
//App.vue
<template>
<div id="app">
<Category v-for="(category, index) in categories" :category="category" :key="index"/>
</div>
</template>
<script>
export default {
components: { Category },
computed: {
...mapState(["categories"])
}
};
</script>
//Category.vue
<template>
<div class="category">
<div class="header">{{ category.name }}</div>
<Item v-for="(item, index) in category.items" :item="item" :key="index"/>
</div>
</template>
<script>
export default {
components: { Item },
props: {
category: { type: Object, required: true }
}
};
</script>
//Item.vue
<template>
<div class="item">
<div class="name">{{ item.name }}</div>
<div class="delete" @click="onDelete">✖</div>
</div>
</template>
<script>
export default {
props: {
item: { type: Object, required: true }
},
methods: {
onDelete() {
this.$store.commit("deleteItem", this.item);
}
}
};
</script>
换句话说,App.vue 从 Vuex 获取类别列表,然后将其传递给 Category.vue 作为每个类别的道具,然后 Category.vue 将 category.items 传递给 Item.vue 作为道具每个项目。
当点击旁边的删除按钮时,我需要删除一个项目:
但是,在Item.vue 级别,我只能访问item,但不能访问category。如果我将 item 发送到 Vuex,我无法判断它属于哪个 category。如何获取对 category 的引用,以便我可以使用 Vuex 从中删除项目?
我可以想到两种方法:
为每个
item将父引用添加回category。这是不可取的,不仅因为我必须处理item数据,还因为它引入了一个循环引用,我不想在应用程序的其他部分处理它。从
Item.vue到Category.vue发出一个事件,让Category.vue处理删除的Vuex 调用。这样类别和要删除的项都是已知的。
有没有更好的方法来处理这种删除?
【问题讨论】:
标签: javascript vue.js vuejs2 vuex