Javascript 使用Vuex,当项目是对象数组的一部分时,如何从数组中删除它们?
此处引用实时演示代码: 假设我有一个Vuex存储,其中包含以下数据:Javascript 使用Vuex,当项目是对象数组的一部分时,如何从数组中删除它们?,javascript,vue.js,vuejs2,vuex,Javascript,Vue.js,Vuejs2,Vuex,此处引用实时演示代码: 假设我有一个Vuex存储,其中包含以下数据: const store = new Vuex.Store({ state: { categories: [ { name: "Category A", items: [{ name: "Item 1" }, { name: "Item 2" }, { name: "Item 3" }] }, { name: "Category B
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>
//App.vue
导出默认值{
组件:{Category},
计算:{
…映射状态([“类别”])
}
};
//Category.vue
{{category.name}
导出默认值{
组件:{Item},
道具:{
类别:{type:Object,必需:true}
}
};
//Item.vue
{{item.name}
✖
导出默认值{
道具:{
项:{type:Object,必需:true}
},
方法:{
onDelete(){
此.store.commit(“deleteItem”,this.item);
}
}
};
换句话说,App.vue
从Vuex获取类别列表,然后将其作为每个类别的道具传递给Category.vue
,然后Category.vue
将Category.items
传递给Item.vue
作为每个项目的道具
单击项目旁边的“删除”按钮时,我需要删除该项目:
但是,在Item.vue
级别,我只能访问项
,而不能访问类别
。如果我将项目
发送到Vuex,我无法判断它属于哪个类别
。如何获取对类别的引用
,以便使用Vuex从中删除该项目
我可以想出两种方法:
项目
将父级引用添加回类别
。这是不受欢迎的,不仅因为我必须处理项
数据,还因为它引入了一个循环引用,我不想在应用程序的其他部分处理它Item.vue
到Category.vue
发出事件,并让Category.vue
处理要删除的Vuex调用。这样,类别和要删除的项目都是已知的Item.vue
到Category.vue
)发出事件),但是,由于您询问了可能性,还有第三种方法:传递回调函数
例如:
Category.vue
:
<template>
<div class="category">
<div class="header">{{ category.name }}</div>
<Item v-for="(item, index) in category.items" :item="item" :key="index"
:on-delete="deleteItem"/>
</div>
</template>
<script>
// ...
export default {
// ...
methods: {
deleteItem(i) {
console.log('cat', this.category.name, 'item', i)
//this.$store.commit("deleteItem", this.item);
}
}
};
</script>
<template>
<div class="item">
<div class="name">{{ item.name }}</div>
<div class="delete" @click="() => onDelete(this.item)">✖</div>
</div>
</template>
<script>
export default {
props: {
item: { type: Object, required: true },
onDelete: { type: Function }
},
};
</script>
。注意,在本例中,回调是onDelete
如果这是React,那么回调肯定是一种更惯用的方式。如前所述,在Vue中,我赞成在子系统中发出事件,并在父系统中处理它(使用
v-on
)。当然,您也可以在类别中声明。Vue
::on delete=“deleteItem(item)”
,这使得它更接近事件选项。
<template>
<div class="category">
<div class="header">{{ category.name }}</div>
<Item v-for="(item, index) in category.items" :item="item" :key="index"
:on-delete="deleteItem"/>
</div>
</template>
<script>
// ...
export default {
// ...
methods: {
deleteItem(i) {
console.log('cat', this.category.name, 'item', i)
//this.$store.commit("deleteItem", this.item);
}
}
};
</script>
<template>
<div class="item">
<div class="name">{{ item.name }}</div>
<div class="delete" @click="() => onDelete(this.item)">✖</div>
</div>
</template>
<script>
export default {
props: {
item: { type: Object, required: true },
onDelete: { type: Function }
},
};
</script>