Vue-列表过滤

列表过滤

对已知的列表进行数据过滤(根据输入框里面的内容进行数据过滤)

编写案例

通过案例来演示说明

在这里插入图片描述

效果就是这样的 输入框是模糊查询

在这里插入图片描述

想要实现功能,其实就两大步,1获取输入框内容 2根据输入内容进行数据过滤

绑定收集数据

我们可以使用v-model去双向绑定

在这里插入图片描述

在这里插入图片描述

这样第一步收集输入数据就完成了
然后就要实现第二步了

使用watch监视实现

首先使用watch实现,对keyWord进行监视

在这里插入图片描述

确认下监视是没有问题的

在这里插入图片描述

既然监视是没有问题,就可以写逻辑操作了

这里使用filter进行过滤,使用indexOf判断是否包含内容,大概说下indexOf判断是否包含字符串的一些基本操作,如果返回-1表示不包含,如果包含会返回当前这个字符串所在的下标,所以判断是否包含,只需要知道结果是否等于-1

在这里插入图片描述

知道了逻辑以及如何使用api就继续编写代码,这里filer会返回一个新的数组,把过滤出来的新数组替换掉老数组

在这里插入图片描述

查看页面,好像是没问题的

在这里插入图片描述

但是这时候我换成周,没有数据了

在这里插入图片描述

解决filer问题

导致这个问题的原因是:使用filter过滤出来的新数据已经没有关于周的姓名了,这么写的逻辑就是越搜越少,persons是原数据,原数据不能直接修改,原数据里面的数据是不能改变的

在这里插入图片描述

既然这样,我们就新增一个属性,专门存储用来过滤出来的数据

在这里插入图片描述

但是发现一个问题,页面初始化的时候是空的

在这里插入图片描述

但是输入一个马,然后删除掉,数据就有了

在这里插入图片描述

这就要说下indexOf的一个细节,indexOf是可以判断空的,会返回0,判断第一个字符,也会返回0

既然知道这个细节,那么上面这个问题也就解释得通了

在这里插入图片描述

想要解决这个bug,就不能使用监视的简写形式了,我们写成正常写法,加上immediate属性设置为true,自动让过滤器执行参数为空

在这里插入图片描述

测试页面。没有任何问题

在这里插入图片描述

使用computed计算属性实现

监视可以实现的,computed都可以实现,下面就使用computed的方式把上面的案例实现下
大概逻辑都是一样的,只是一些语法不一样,比如watch里面的参数在computed是没有的,我们可以换成this获取。然后返回出去新的结果

在这里插入图片描述

效果也是一样的

在这里插入图片描述

watch和computed对比

通过这个案例知道了使用watch和computed都可以实现,通过对比发现很明显,watch更麻烦一些,computed更精简一些,当两者都能实现的时候,优先使用computed

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Vue 中,List Query 是指在列表页面中实现搜索、过滤、排序等操作的功能。通常情况下,我们需要在组件中定义一个列表数据源(比如一个数组或者一个 API 接口),然后在模板中展示这个数据源。接着,在组件中定义一些状态变量来表示搜索条件、排序方式等,然后在模板中通过表单元素(比如输入框、下拉框等)与这些状态变量进行绑定,从而实现搜索、过滤、排序等功能。 下面是一个简单的示例,展示了如何在 Vue 中实现一个基本的 List Query: ```html <template> <div> <label>Search:</label> <input type="text" v-model="searchText"> <label>Sort by:</label> <select v-model="sortBy"> <option value="name">Name</option> <option value="age">Age</option> </select> <table> <thead> <tr> <th>Name</th> <th>Age</th> </tr> </thead> <tbody> <tr v-for="person in filteredList" :key="person.id"> <td>{{ person.name }}</td> <td>{{ person.age }}</td> </tr> </tbody> </table> </div> </template> <script> export default { data() { return { people: [ { id: 1, name: 'Alice', age: 25 }, { id: 2, name: 'Bob', age: 30 }, { id: 3, name: 'Charlie', age: 20 }, ], searchText: '', sortBy: 'name', }; }, computed: { filteredList() { let list = this.people.slice(); if (this.searchText) { list = list.filter(person => person.name.toLowerCase().includes(this.searchText.toLowerCase()) ); } if (this.sortBy === 'name') { list = list.sort((a, b) => a.name.localeCompare(b.name)); } else { list = list.sort((a, b) => a.age - b.age); } return list; }, }, }; </script> ``` 在这个示例中,我们首先定义了一个 people 数组来表示人员列表。然后,我们定义了两个状态变量 searchText 和 sortBy,分别表示搜索文本和排序方式。在模板中,我们使用一个输入框和一个下拉框来与这两个状态变量进行绑定。最后,在计算属性 filteredList 中,我们根据搜索文本和排序方式对人员列表进行过滤和排序,并返回过滤后的列表。 需要注意的是,在实际开发中,我们通常会将列表数据源和状态变量放在一个 Vuex store 中,以便在多个组件之间共享数据。同时,我们也可以使用第三方库(比如 Element UI 或者 Vuetify)来快速地构建出复杂的 List Query 功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小花皮猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值