用侦听属性实现列表过滤:
<div id="APP">
<input type="text" v-model="keyWord">
<ul>
<li v-for="(item,index) of newList" :key="item.id">
{{item.name}} - {{item.age}} - {{item.sex}}
</li>
</ul>
</div>
const vm = new Vue({
el: "#APP",
data(){
return {
// keyWord 用于接收用户输入的内容
keyWord:"",
// 原始数据列表,用于过滤,不可更改
list:[
{id:1, name:"马冬梅", age:30, sex:"女"},
{id:2, name:"周冬雨", age:18, sex:"女"},
{id:3, name:"周杰伦", age:26, sex:"男"},
{id:4, name:"温兆伦", age:24, sex:"男"}
],
// 过滤后的数据列表,用于渲染页面
newList:[]
}
},
watch:{
// 监听 keyWord 数据变化,当用户输入时进行操作
keyWord:{
// 初始化时执行一下,避免页面加载时 newList 中没有数据
immediate:true,
handler(val){
// 利用 filter 方法让 newList 等于过滤后的数据列表
this.newList = this.list.filter((item) => {
// 利用 indexOf 方法返回条件成立的数据
return item.name.indexOf(val) !== -1;
})
}
}
}
});
注:filter 方法不归 Vue 管理,所以要写成箭头函数的形式。
用计算属性实现列表过滤【推荐】:
<div id="APP">
<input type="text" v-model="keyWord">
<ul>
<li v-for="(item,index) of newList" :key="item.id">
{{item.name}} - {{item.age}} - {{item.sex}}
</li>
</ul>
</div>
const vm = new Vue({
el: "#APP",
data(){
return {
// keyWord 用于接收用户输入的内容
keyWord:"",
// 原始数据列表,用于过滤,不可更改
list:[
{id:1, name:"马冬梅", age:30, sex:"女"},
{id:2, name:"周冬雨", age:18, sex:"女"},
{id:3, name:"周杰伦", age:26, sex:"男"},
{id:4, name:"温兆伦", age:24, sex:"男"}
]
}
},
computed:{
// 计算一个新的数据列表,用于渲染页面
newList(){
// 返回过滤后的数据列表
return this.list.filter((item) => {
return item.name.indexOf(this.keyWord) !== -1;
})
}
}
});
用计算属性实现列表排序:
<div id="APP">
<input type="text" v-model="keyWord">
<button @click="sortType = 2">年龄升序</button>
<button @click="sortType = 1">年龄降序</button>
<button @click="sortType = 0">原顺序</button>
<ul>
<li v-for="(item,index) of newList" :key="item.id">
{{item.name}} - {{item.age}} - {{item.sex}}
</li>
</ul>
</div>
const vm = new Vue({
el: "#APP",
data(){
return {
keyWord: "",
// 0 表示原顺序、1 降序、2 升序
sortType: 0,
list:[
{id:1, name:"马冬梅", age:30, sex:"女"},
{id:2, name:"周冬雨", age:18, sex:"女"},
{id:3, name:"周杰伦", age:26, sex:"男"},
{id:4, name:"温兆伦", age:24, sex:"男"}
]
}
},
computed:{
newList(){
// 因为需要排序过滤之后的数据,所以不能直接返回
const arr = this.list.filter((item) => {
return item.name.indexOf(this.keyWord) !== -1;
})
// 判断 sortType 是否不为 0,不为 0 表示需要排序
if(this.sortType){
arr.sort((min,max) => {
// 1 表示降序,从大到小。2 表示升序,从小到大
if(this.sortType === 1){
return max.age - min.age;
}else{
return min.age - max.age;
}
})
}
return arr;
}
}
});
原创作者:吴小糖
创作时间:2023.3.14