Vue(Vue2+Vue3)——16.列表过滤、17.列表排序

简介: Vue(Vue2+Vue3)——16.列表过滤、17.列表排序

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>

代码写完后查看页面

升序

降序

原顺序

相关文章
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
330 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
310 137
|
2月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
540 139
|
2月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
255 1
|
3月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
415 11
|
2月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
292 0
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
820 0
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
7月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
898 77
|
5月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
443 1