当前位置: 首页 > news >正文

Vue.js 列表过滤实现详解(watch和computed实现)

Vue.js 列表过滤实现详解

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>英雄列表过滤</title><!-- 引入Vue.js库 --><script src="../js/vue.js"></script>
</head><body><!-- Vue应用挂载点 --><div id="app"><!-- 搜索输入框,使用v-model双向绑定keyword --><input type="text" placeholder="请输入搜索内容" v-model="keyword"><!-- 英雄列表表格 --><table border="1px"><tr><th>序号</th><th>名字</th></tr><!-- 使用v-for循环渲染过滤后的英雄列表 --><tr v-for="hero in newArr" :key="hero.id"><td>{{hero.id}}</td><td>{{hero.name}}</td></tr></table></div><script>// 创建Vue实例new Vue({el: "#app",  // 指定挂载元素// 数据对象data: {keyword: '',  // 搜索关键词heros: [     // 英雄原始数据{ id: 1, name: '亚索' },{ id: 2, name: '盖伦' },{ id: 3, name: '艾希伦' },{ id: 4, name: '提莫' },{ id: 5, name: '李提青' }],newArr: []   // 存储过滤后的英雄数组},// 监视器watch: {// 监视keyword的变化keyword: {immediate: true,  // 初始化时立即执行handlerhandler(val) {    // 处理函数,val是keyword的新值// 过滤英雄数组this.newArr = this.heros.filter((hero) => {// 检查英雄名字是否包含搜索关键词// 返回true表示保留该英雄,false表示过滤掉return hero.name.indexOf(val) >= 0;});}}}}) </script></body>
</html>

Vue.js 列表过滤实现文档

1. 功能概述

该代码实现了一个基于Vue.js的英雄列表过滤功能:

  • 用户可以在输入框中输入搜索关键词
  • 表格会实时显示名字包含搜索关键词的英雄
  • 支持中文搜索(不区分大小写)
  • 初始加载时显示所有英雄

2. 核心代码解析

2.1 数据模型
data: {keyword: '',  // 存储搜索关键词heros: [     // 原始英雄数据{ id: 1, name: '亚索' },{ id: 2, name: '盖伦' },// ...其他英雄],newArr: []   // 存储过滤后的结果
}
2.2 监听器实现
watch: {keyword: {immediate: true,  // 初始化时立即执行handlerhandler(val) {    // 当keyword变化时执行this.newArr = this.heros.filter((hero) => {// 使用indexOf检查英雄名字是否包含关键词return hero.name.indexOf(val) >= 0;});}}
}
2.3 模板渲染
<!-- 输入框双向绑定keyword -->
<input type="text" v-model="keyword"><!-- 渲染过滤后的列表 -->
<tr v-for="hero in newArr" :key="hero.id"><td>{{hero.id}}</td><td>{{hero.name}}</td>
</tr>

3. 功能特点

  1. 实时响应:使用v-model实现输入框与数据的双向绑定
  2. 即时过滤:通过watch监听关键词变化,实时更新列表
  3. 初始加载immediate: true确保页面加载时显示完整列表
  4. 性能优化:使用数组的filter方法高效过滤数据
  5. 键值绑定v-for配合:key="hero.id"提高渲染效率

4. 工作原理流程图

用户输入关键词
v-model更新keyword
watch检测到keyword变化
执行handler函数
使用filter过滤heros数组
更新newArr数据
Vue重新渲染表格

5. 使用说明

  1. 在输入框中输入任意字符(如"提")
  2. 表格将实时显示包含该字符的英雄(如"提莫"和"李提青")
  3. 清空输入框将显示所有英雄
  4. 支持部分匹配(如输入"伦"会显示"盖伦"和"艾希伦")

6. 优化建议

  1. 添加空状态提示

    <tr v-if="newArr.length === 0"><td colspan="2">未找到匹配的英雄</td>
    </tr>
    
  2. 不区分大小写搜索

    return hero.name.toLowerCase().indexOf(val.toLowerCase()) >= 0;
    
  3. 防抖处理(避免频繁触发):

    handler: _.debounce(function(val) {// 过滤逻辑
    }, 300)
    
  4. 使用计算属性替代watch

    computed: {filteredHeros() {return this.heros.filter(hero => hero.name.indexOf(this.keyword) >= 0);}
    }
    

7. 实际效果演示

搜索关键词显示结果
(空)所有英雄
“伦”盖伦、艾希伦
“提”提莫、李提青
“亚”亚索
“不存在”空列表

8. 总结

该实现展示了Vue.js的核心功能:

  1. 数据绑定(v-model
  2. 响应式系统(watch
  3. 列表渲染(v-for
  4. 数组处理(filter

9.使用计算属性来实现

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/vue.js"></script>
</head><body><div id="app"><input type="text" placeholder="请输入搜索内容" v-model="keyword"><table border="1px"><tr><th>序号</th><th>名字</th></tr><tr v-for="hero in newArr" :key="hero.id"><td>{{hero.id}}</td><td>{{hero.name}}</td></tr></table></div><script>new Vue({el: "#app",data: {keyword: '',heros: [ // 英雄数据{ id: 1, name: '亚索' },{ id: 2, name: '盖伦' },{ id: 3, name: '艾希伦' },{ id: 4, name: '提莫' },{ id: 5, name: '李提青' }]},computed: {newArr() {return this.heros.filter((hero) => {return hero.name.indexOf(this.keyword) >= 0})}}}) </script></body></html>

通过简洁的代码实现了高效的列表过滤功能,是Vue.js响应式编程的典型应用场景。

http://www.lqws.cn/news/508807.html

相关文章:

  • PYTHON从入门到实践4-数据类型
  • 原子操作(CAS)
  • OSS跨区域复制灾备方案:华东1到华南1的数据同步与故障切换演练
  • 嵌入式开发学习日志Day8(ARM体系架构——按键、蜂鸣器及中断)
  • 【bug】searchxng搜索报错Searx API returned an error
  • Vue项目使用defer优化页面白屏,性能优化提升,秒加载!!!
  • java-SpringBoot框架开发计算器网页端编程练习项目【web版】
  • QT多线程
  • Git 子模块 (Submodule) 完全使用指南
  • 烟花爆竹生产企业库房存储安全风险预警系统
  • 【Pandas】pandas DataFrame update
  • 【Docker基础】Docker容器管理:docker stop详解
  • Vue.js:渐进式框架赋能现代Web开发
  • 蓝桥杯嵌入式学习(cubemxkeil5)
  • word中如何快速打出上标?
  • 20250624java面试总结
  • 第九节 CSS工程化-预处理技术对比
  • 大白话蓝牙中的RPC:Remote Procedure Call远程过程调用
  • 壁挂马桶品牌推荐:我的“瑞尔特瑞家HX5”沉浸式体验报告健康与洁净的硬核科技
  • 从设备自动化到智能管控:MES如何赋能牛奶饮料行业高效生产?
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 10(题目+回答)
  • Flask(四) 模板渲染render_template
  • 用Rust写平衡三进制加法器
  • 调试HDMI音频能8通道播放声音
  • 开疆智能CCLinkIE转ModbusTCP网关连接川崎机器人配置案例
  • linux grep的一些坑
  • GelSight Mini视触觉传感器开发资源升级:触觉3D点云+ROS2助力机器人科研与医疗等应用
  • Flutter动画开发:从基础到高级实战
  • Luckysheet Excel xlsx 导入导出互相转换
  • css color 十六进制颜色透明度