Vue(Vue2+Vue3)——16.列表过滤、17.列表排序
16 列表过滤
对已知的列表进行数据过滤(根据输入框里面的内容进行数据过滤)
16.1 编写案例
通过案例来演示说明
效果就是这样的 输入框是模糊查询
想要实现功能,其实就两大步,1获取输入框内容 2根据输入内容进行数据过滤
16.2 绑定收集数据
我们可以使用v-model去双向绑定
这样第一步收集输入数据就完成了
然后就要实现第二步了
16.3 使用watch监视实现
首先使用watch实现,对keyWord进行监视
确认下监视是没有问题的
既然监视是没有问题,就可以写逻辑操作了
这里使用filter进行过滤,使用indexOf判断是否包含内容,大概说下indexOf判断是否包含字符串的一些基本操作,如果返回-1表示不包含,如果包含会返回当前这个字符串所在的下标,所以判断是否包含,只需要知道结果是否等于-1
知道了逻辑以及如何使用api就继续编写代码,这里filer会返回一个新的数组,把过滤出来的新数组替换掉老数组
查看页面,好像是没问题的
但是这时候我换成周,没有数据了
16.4 解决filer问题
导致这个问题的原因是:使用filter过滤出来的新数据已经没有关于周的姓名了,这么写的逻辑就是越搜越少,persons是原数据,原数据不能直接修改,原数据里面的数据是不能改变的
既然这样,我们就新增一个属性,专门存储用来过滤出来的数据
但是发现一个问题,页面初始化的时候是空的
但是输入一个马,然后删除掉,数据就有了
这就要说下indexOf的一个细节,indexOf是可以判断空的,会返回0,判断第一个字符,也会返回0
既然知道这个细节,那么上面这个问题也就解释得通了
想要解决这个bug,就不能使用监视的简写形式了,我们写成正常写法,加上immediate属性设置为true,自动让过滤器执行参数为空
测试页面。没有任何问题
16.5 使用computed计算属性实现
监视可以实现的,computed都可以实现,下面就使用computed的方式把上面的案例实现下
大概逻辑都是一样的,只是一些语法不一样,比如watch里面的参数在computed是没有的,我们可以换成this获取。然后返回出去新的结果
效果也是一样的
16.6 watch和computed对比
通过这个案例知道了使用watch和computed都可以实现,通过对比发现很明显,watch更麻烦一些,computed更精简一些,当两者都能实现的时候,优先使用computed
17 列表排序
17.1 编写案例
- 在列表过滤的基础上新增一个功能,可以安装指定的条件进行升序或者降序(自上而下)
- 这里补充下,鼠标远中一行,然后按alt+shift+↓可以复制一行,和IDEA里面的ctrl+d是一样的
查看页面
为了方便实现,给三个不同的按钮单击定义不同的数字含义,原顺序为0,降序为1,升序为2,可以定义出来这个变量,然后根据每一个按钮的单击事件传入不同的参数
然后在过滤的逻辑上进行修改,先不要返回,等根据年龄排序过滤好之后再进行返回
js说到排序,就不得不提起sort这个函数,这里就简单说下sort的使用
17.2 sort排序简单说明
sort函数有两个参数(max,min),如果需要升序就用max-min,如果需要降序就用min-max,需要用return把排好序的数组返回出来,排序后的数组会覆盖原来的数组
排序
降序
既然知道了使用sort的方式,就可以完善代码逻辑了,在这里不能直接使用参数本身,而是对象里面的age属性进行排序
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>初始vue</title> <!-- 引入vue.js --> <script type="text/javascript" src="../js/vue.js"></script> </head> <body> <div id="root"> <h2>人员列表</h2> <input type="text" placeholder="请输入名字" v-model="keyWord"> <button @click="sortType=2">年龄升序</button> <button @click="sortType=1">年龄降序</button> <button @click="sortType=0">原顺序</button> <ul> <li v-for="(person,index) of filPersons" :key="index"> {{person.name}}-{{person.age}}-{{person.sex}} </li> </ul> </div> </body> <script type="text/javascript"> const vm= new Vue({ el:'#root', data:{ // 输入框输入的内容 由于一开始肯定是空的,所以初始化为空 keyWord:'', sortType:'0', //0原顺序,1降序,2升序 persons:[ {id:'001',name:'马冬梅',age:'18',sex:'女'}, {id:'002',name:'周冬雨',age:'9',sex:'女'}, {id:'003',name:'周杰伦',age:'31',sex:'男'}, {id:'004',name:'温兆伦',age:'56',sex:'男'} ], }, computed:{ filPersons(){ const arr= this.filPersons= this.persons.filter((p)=>{ //name里面是否包含输入框输入的内容 使用indexOf判断是否包含 return p.name.indexOf(this.keyWord)!==-1 }) // 判断是否需要排序 这样的判读sortType只能是1或者2,0是进不来的 if(this.sortType){ arr.sort((a,b)=>{ return this.sortType===1?b.age-a.age:a.age-b.age }) } //返回最终排序好的数组 return arr } } }) </script> </html>
代码写完后查看页面
升序
降序
原顺序