有两个问题。第一个问题是,您将v-model 设置为v-model="filter.filterCollection",因此您选择的复选框将作为字符串存储到数组中,如果您选择另一个复选框,则字符串将被覆盖。第二个问题是,您将该存储的字符串称为数组。这导致您的字符串(一个字母数组)将为每个字母呈现。所以“数字”就像["N", "u", "m", "b", "e", "r"]。
要解决您的问题,您需要将每个选择及其自己的引用存储在您的v-model 中。为了满足您正确列出和正确删除的需求,您需要应用以下更改:
你的复选框循环
<Checkbox
v-for="(item, index) in items"
:key="item.id"
:label="item.name"
:id="index"
:isChecked="isChecked(index)" // this is new
@remove-selected-filter="removeSelectedFilter" // This is new
:modelValue="item.name"
v-model="filter.filterCollection[index]" // Change this
/>
你的 v-model
filter: {
filterCollection: {} // Object instead of array
}
FilterPopUp.vue 中的方法
methods: {
removeSelectedFilter(index) {
delete this.filter.filterCollection[index];
},
isChecked(index) {
return !!this.filter.filterCollection[index];
}
}
你的 Checkbox.vue:
<template>
<label>
<p>{{ label }}</p>
<input
type="checkbox"
:id="id"
:value="modelValue"
:checked="isChecked"
@change="emitUncheck($event.target.checked)"
@input="$emit('update:modelValue', $event.target.value)"
/>
<span class="checkmark"></span>
</label>
</template>
<script>
export default {
name: "Checkbox",
props: {
modelValue: { type: String, default: "" },
isChecked: Boolean,
label: { type: String },
value: { type: Array },
id: { type: Number },
},
methods: {
emitUncheck(event) {
if(!event){
this.$emit('remove-selected-filter', this.id);
}
}
}
};
</script>
现在应该可以正确显示您的项目,正确删除项目并在删除项目后取消选中复选框。