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>

代码写完后查看页面

升序

降序

原顺序

相关文章
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
这篇文章通过一个实际的Vue项目案例,演示了如何在Vuex中实现多组件间共享数据。文章内容包括在Vuex的state中新增用户数组,创建Person.vue组件用于展示和添加用户信息,以及在Count组件中使用Person组件操作的数据。通过测试效果展示了组件间数据共享和状态更新的流程。
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)
这篇文章详细介绍了Vuex的模块化编码和命名空间的使用,旨在让代码更易于维护并提高数据分类的明确性。内容包括模块化和命名空间的概念、如何在store中配置模块、以及如何在组件中使用模块化的数据。文章通过实战项目案例,展示了如何拆分`store/index.js`文件,创建`count.js`和`person.js`模块,并在`Count.vue`和`Person.vue`组件中使用这些模块。最后,文章还提供了测试效果和一些使用注意点。
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)
|
1天前
|
存储 JavaScript 前端开发
Vue学习之--------路由(Router)的基本使用(1)(2022/9/5)
这篇文章是关于Vue-router路由的基本使用教程,涵盖了安装配置、应用插件、编写路由规则、实现页面跳转和高亮显示,以及一些使用中的注意点和项目实际应用案例。
Vue学习之--------路由(Router)的基本使用(1)(2022/9/5)
|
1天前
|
缓存 JavaScript
Vue学习之--------多级路由的使用(2)(2022/9/5)
这篇文章介绍了在Vue中实现多级路由缓存的方法,包括在路由配置中添加meta属性以启用缓存,使用keep-alive组件包裹需要缓存的视图,以及在Vuex中管理缓存视图列表的逻辑。
Vue学习之--------多级路由的使用(2)(2022/9/5)
|
1天前
|
JavaScript 前端开发 开发者
Vue学习之--------深入理解Vuex、原理详解、实战应用(2022/9/1)
这篇文章详细介绍了Vuex的基本概念、使用场景、安装配置、基本用法、实际应用案例以及注意事项,通过一个数字累加器的实战示例,帮助开发者深入理解Vuex的原理和应用。
|
1天前
|
存储 JavaScript API
vue后台管理权限码处理
【8月更文挑战第19天】vue后台管理权限码处理
8 0
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)
这篇文章深入探讨了Vuex中的getters概念和用法,以及如何通过mapState、mapGetters、mapActions和mapMutations四个辅助函数简化组件中的Vuex状态访问和操作,通过实际项目案例展示了这些概念的应用和效果。
|
4天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
4天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
4天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。