Vue 列表过滤
这里使用两种方式来实现 列表过滤:watch、computed
列表过滤_侦听器watch实现
侦听器(监听属性):watch
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>列表过滤_watch</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<input type="text" placeholder="请输入名字" v-model="keyWord">
<ul>
<li v-for="(p,index) in filPersons" :key="p.id">
{{p.name}} - {{p.sex}} - {{p.age}}
</li>
</ul>
</div>
</body>
<script type="text/javascript">
new Vue({
el: '#root',
data: {
persons: [
{id: '001', name: '王大锤', sex: '女', age: 36},
{id: '002', name: '王小李', sex: '男', age: 19},
{id: '003', name: '李大刚', sex: '男', age: 21},
{id: '004', name: '王小刚', sex: '女', age: 20},
],
keyWord: '',
filPersons: []
},
watch: {
keyWord: {
immediate: true,
handler(val) {
this.filPersons = this.persons.filter((p) => {
return p.name.indexOf(val) !== -1
})
}
}
}
})
</script>
</html>
列表过滤_计算属性computed实现
计算属性:computed
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>列表过滤_computed</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<input type="text" placeholder="请输入名字" v-model="keyWord">
<ul>
<li v-for="(p,index) in filPersons" :key="p.id">
{{p.name}} - {{p.sex}} - {{p.age}}
</li>
</ul>
</div>
</body>
<script type="text/javascript">
new Vue({
el: '#root',
data: {
persons: [
{id: '001', name: '王大锤', sex: '女', age: 36},
{id: '002', name: '王小李', sex: '男', age: 19},
{id: '003', name: '李大刚', sex: '男', age: 21},
{id: '004', name: '王小刚', sex: '女', age: 20},
],
keyWord: '',
},
computed: {
filPersons() {
return this.filPersons = this.persons.filter((p) => {
return p.name.indexOf(this.keyWord) !== -1
})
}
}
})
</script>
</html>
对比
在实现功能相同的情况下:更加推荐使用 计算属性,它比 侦听器 要简便许多
计算属性 回调函数在两个时候被调用:页面刚进入时、计算时所依赖的数据发生变化时
而 侦听器需要配置:immediate: true
才可以在页面刚进入时调用回调函数