【发布时间】:2023-04-09 00:17:01
【问题描述】:
基本上,此代码负责将sortedCars 数组中包含的汽车名称列表显示到下拉列表中。 (此数组按字符串 asc 排序)。
现在,我添加了一个输入文本,并尝试自动过滤与输入的名称值匹配的汽车列表。
使用以下代码,用户界面永远不会更新。哪里错了?
<template>
<div class="btn-group pull-left">
<input type="text" @keyup="onFilterCars" v-model="searchCarTextValue" />
<a v-for="car in this.sortedCars" :key="car.name" @click="onSelectCategoryFilterLabel" class="dropdown-item" href="#">
<span v-else>{{ car.name }}</span>
</a>
</div>
</template>
<script>
export default {
data() {
return {
inputFilterText: "",
mapFilteringEnabled: false,
searchCarTextValue: ""
};
},
props: {
cars: {
type: Array
}
},
computed: {
sortedCars: function() {
function compare(a, b) {
if (a.name < b.name)
return -1;
if (a.name > b.name)
return 1;
return 0;
}
var sortedArr = this.cars.sort(compare);
return sortedArr;
}
},
methods: {
onFilterCars() {
if (this.searchCarTextValue) {
var arrayFiltered = this.sortedCars.filter( (car) => {
return car.name.toLowerCase().indexOf(this.searchCarTextValue.toLowerCase()) != -1
});
this.sortedCars = arrayFiltered;
}
}
}
};
</script>
【问题讨论】:
-
一个注释:
this.sortedCars每次都会改变,所以一段时间后它什么都不包含,相反,您应该将所有汽车的列表保存在其他地方并从该列表中过滤而不更改它,因此有效地有两个列出一辆包含所有汽车和一辆已过滤 -
computed属性将在其依赖属性更改时automatically recompute。你根本不需要onFilterCars处理程序。 -
你有两次
div"....不是答案而是问题 -
和一个没有
v-if的span v-else
标签: javascript vue.js vuejs2