[vue] 列表过滤

基本页面

<div id="root">
	<h2>人员列表h2>
	<input type="text" placeholder="请输入名字" v-model="keyWord">
	<ul>
		<li v-for="(p,index) of persons" :key="index">
			{{p.name}}-{{p.age}}-{{p.sex}}
		li>
	ul>
div>
new Vue({
		el:'#root',
			data:{
				keyWord:'',
				persons:[
					{id:'001',name:'马冬梅',age:19,sex:'女'},
					{id:'002',name:'周冬雨',age:20,sex:'女'},
					{id:'003',name:'周杰伦',age:21,sex:'男'},
					{id:'004',name:'温兆伦',age:22,sex:'男'}
				]
			},
			
		}) 

[vue] 列表过滤_第1张图片

期望效果:

[vue] 列表过滤_第2张图片

加上过滤

<div id="root">
	<h2>人员列表h2>
	<input type="text" placeholder="请输入名字" v-model="keyWord">
	<ul>
		<li v-for="(p,index) of persons" :key="index">
			{{p.name}}-{{p.age}}-{{p.sex}}
		li>
	ul>
div>
new Vue({
	el:'#root',
	data:{
		keyWord:'',
		persons:[
			{id:'001',name:'马冬梅',age:19,sex:'女'},
			{id:'002',name:'周冬雨',age:20,sex:'女'},
			{id:'003',name:'周杰伦',age:21,sex:'男'},
			{id:'004',name:'温兆伦',age:22,sex:'男'}
		],
	},
	watch: {
       keyWord:{
            immediate:true,  //立即执行
            handler(val){
                this.persons = this.persons.filter((p)=>{
                    return p.name.indexOf(val)!=-1
                })
            }
        }
    }
}) 

[vue] 列表过滤_第3张图片
列表的内容越搜索越少

如何解决列表的内容越搜索越少的问题?使用一个新的数组filPerons接收过滤后的数据,即不改动初试的数据组persons。

使用计算属性做+新数组

<div id="root">
	<h2>人员列表h2>
	<input type="text" placeholder="请输入名字" v-model="keyWord">
	<ul>
		<li v-for="(p,index) of filPerons" :key="index">
			{{p.name}}-{{p.age}}-{{p.sex}}
		li>
	ul>
div>
new Vue({
	el:'#root',
	data:{
		keyWord:'',
		persons:[
			{id:'001',name:'马冬梅',age:19,sex:'女'},
			{id:'002',name:'周冬雨',age:20,sex:'女'},
			{id:'003',name:'周杰伦',age:21,sex:'男'},
			{id:'004',name:'温兆伦',age:22,sex:'男'}
		]
	},
	computed:{
		filPerons(){
			return this.persons.filter((p)=>{
				return p.name.indexOf(this.keyWord) !== -1
			})
		}
	}
}) 

[vue] 列表过滤_第4张图片

使用监视属性做

<div id="root">
	<h2>人员列表h2>
	<input type="text" placeholder="请输入名字" v-model="keyWord">
	<ul>
		<li v-for="(p,index) of filPerons" :key="index">
			{{p.name}}-{{p.age}}-{{p.sex}}
		li>
	ul>
div>
new Vue({
	el:'#root',
	data:{
		keyWord:'',
		persons:[
			{id:'001',name:'马冬梅',age:19,sex:'女'},
			{id:'002',name:'周冬雨',age:20,sex:'女'},
			{id:'003',name:'周杰伦',age:21,sex:'男'},
			{id:'004',name:'温兆伦',age:22,sex:'男'}
		],
		filPerons:[]
	},
	watch:{
		keyWord:{
			immediate:true,
			handler(val){
				this.filPerons = this.persons.filter((p)=>{
					return p.name.indexOf(val) !== -1
				})
			}
		}
	}
}) 

[vue] 列表过滤_第5张图片
immediate设置为真,立即执行
这里的原理是还没有输入任何查询字符时,即查询框为空,那么立即执行监视操作,此时监视属性中的监视value值为空,那么就返回所有的原始数据,因为所有的字符串数据使用indexof查询都含有空值。

演示一下没加immediate的效果:

[vue] 列表过滤_第6张图片

默认上来没有任何数据展示
加上immediate后,keyword=’’,返回所有数据,那一加载成功页面,就会有数据了,如下:
[vue] 列表过滤_第7张图片











参考:

前端VUE3.0,DAY19,列表过滤

你可能感兴趣的:(#,vue,vue.js)