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

Vue基础知识-使用监视属性watch和计算属性computed实现列表过滤+排序

一、完整源码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/vue.js"></script>
</head>
<body><div id="root">监视属性实现按名模糊搜索:<input type="text" v-model="keyword" /></br></br><table border="1px solid black"><tr><td>id</td><td>姓名</td><td>年龄</td></tr><tr v-for = 'person in filterPersons' :key="person.id"><td>{{person.id}}</td><td>{{person.name}}</td><td>{{person.age}}</td></tr></table><hr>计算属性实现按名模糊搜索:<input type="text" v-model="keyword2" /><input type="button"  @click="sortType = 1" value="年龄升序"/><input type="button" @click="sortType = 2" value="年龄降序"/></br></br><table border="1px solid black"><tr><td>id</td><td>姓名</td><td>年龄</td></tr><tr v-for = 'person in filterPersons2' :key="person.id"><td>{{person.id}}</td><td>{{person.name}}</td><td>{{person.age}}</td></tr></table></div>
</body><script>const vm = new Vue({el:'#root',data() {return {persons:[{id:1,name:'张三',age:19},{id:2,name:'李四',age:15},{id:3,name:'王五',age:16},{id:4,name:'张三2',age:17}],filterPersons:[],keyword:'',keyword2:'',sortType:0}},watch:{keyword:{immediate:true, //立即执行监视handler(val){//filter将返回一个新的数组;'abc'.indexOf('')的返回值为0this.filterPersons = this.persons.filter((person)=>{return person.name.indexOf(val) !== -1   //包含val则保留该person})}},},//filterPersons2 何时调get? 1 上来就调用 2 依赖的keyword2,sortType变化就调用computed:{filterPersons2(){const arr =  this.persons.filter((person)=>{return person.name.indexOf(this.keyword2) !== -1  })if(this.sortType){arr.sort((person1,person2)=>{return this.sortType == 2 ?person2.age - person1.age:person1.age - person2.age})}return arr}}})</script>
</html>

二、核心知识点解析

1. 功能模块拆解

页面分为两个独立模块,对比展示watchcomputed的差异:

模块核心技术功能依赖数据
上方表格watch仅姓名模糊搜索keyword
下方表格computed姓名模糊搜索 + 年龄升 / 降序排序keyword2、sortType

2. 监视属性(watch)详解

2.1 为什么需要immediate: true

Vue 的watch默认仅在监听的数据(如 keyword)发生变化时才触发 handler,初始化时(页面加载时)不会执行。
若不加immediate: true,页面打开时filterPersons为空,表格会显示空白;加上后,初始化时会主动执行一次 handler,加载所有人员数据。

2.2 filterindexOf的核心逻辑
  • Array.prototype.filter():遍历数组,返回一个新数组,包含所有满足 “回调函数返回 true” 的元素(不修改原数组)。
  • String.prototype.indexOf(val):返回val在字符串中首次出现的索引,若不存在则返回-1
    关键细节:'abc'.indexOf('')返回0,因此当搜索框为空(keyword='')时,person.name.indexOf('') !== -1恒成立,表格会显示所有数据。

3. 计算属性(computed)详解

3.1 computed 的核心特性:依赖缓存

computed的属性(如filterPersons2)会缓存计算结果,只有当它依赖的数据(keyword2sortType)发生变化时,才会重新执行getter(即函数体);若依赖数据不变,多次访问filterPersons2会直接返回缓存值,避免重复计算,效率高于methods

3.2 排序逻辑解析
filteredArr.sort((p1, p2) => {return this.sortType === 2 ? p2.age - p1.age : p1.age - p2.age
})
  • sort方法的回调函数返回值规则:
    • 返回正数:p1 排在 p2 后面(升序);
    • 返回负数:p1 排在 p2 前面(降序);
    • 返回 0:顺序不变。
  • 此处通过sortType控制排序方向:
    • sortType=1:升序 → p1.age - p2.age(如 15-16=-1,15 排在 16 前);
    • sortType=2:降序 → p2.age - p1.age(如 16-15=1,16 排在 15 前)。

三、运行效果与注意事项

1. 运行效果

  1. 页面加载时,两个表格均显示所有 4 条人员数据;
  2. 上方搜索框输入 “张”,仅显示 “张三” 和 “张三 2”;
  3. 下方搜索框输入 “张”,再点击 “年龄降序”,表格按 “19(张三)→17(张三 2)” 排序;
  4. 点击 “年龄升序”,下方表格按 “17(张三 2)→19(张三)” 排序。

2. 注意事项

  • Vue 版本:本文使用Vue2(代码中new Vue({el: '#root'})为 Vue2 语法),若使用 Vue3,需调整为createApp语法;
  • 数组方法影响:sort方法会修改原数组,本文中filteredArrfilter返回的新数组,修改它不会影响原始persons数据,避免数据污染;
  • 兼容性:indexOf在所有现代浏览器中支持,若需兼容更老浏览器,可替换为includes(如person.name.includes(val))。

四、总结

  • watch更适合 “监听单个数据变化并执行逻辑” 的场景,如数据变化后发起接口请求;
  • computed更适合 “依赖多个数据计算派生值” 的场景,如表格的过滤 + 排序,且缓存机制能提升性能。
http://www.dtcms.com/a/362369.html

相关文章:

  • 【数据可视化-104】安徽省2025年上半年GDP数据可视化分析:用Python和Pyecharts打造炫酷大屏
  • 【期末复习】--软件工程
  • 基于单片机智能按摩器设计
  • IOS打包上传 出现 You do not have required contracts to perform an operation 的解决办法
  • WEEX:从某DEX代币暴涨看加密交易选择
  • 基于SpringBoot音乐翻唱平台
  • 基于FPGA+DSP数据采集处理平台的搭建
  • Docker的应用
  • OpenCV 实战:图像模板匹配与旋转处理实现教程
  • C++精选面试题集合(100份大厂面经提取的200+道真题)
  • Android入门到实战(六):Android主流图片加载框架
  • ANTD-TABLE表格字段明细展示
  • (Redis)Redis 分布式锁及改进策略详解
  • UE5 为啥原生的NotifyState写逻辑会有问题
  • Java异常处理详解:掌握try-catch-finally与try-with-resources,避开空指针等踩坑点
  • 20250901的学习笔记
  • 全栈智算系列直播回顾 | 智算中心对网络的需求与应对策略(下)
  • 【LeetCode】3670. 没有公共位的整数最大乘积 (SOSDP)
  • 笔记:人工神经网络
  • Vue基础知识-Vue中:class与:style动态绑定样式
  • DiffusionGPT-LLM驱动的文本生成图像系统
  • OpenStack网络类型解析
  • Markdown 语法全面指南
  • EXPLAIN 和 EXPLAIN ANALYZE
  • 【AI报表】JimuReport 积木报表 v2.1.3 版本发布,免费可视化报表和大屏
  • Python 爬虫案例:爬取豆瓣电影 Top250 数据
  • 【开题答辩全过程】以 基于SSM的高校疫情防控管理系统为例,包含答辩的问题和答案
  • docker中的命令(六)
  • 轻量实现 OCPP 1.6 JSON 协议(欧洲版)的充电桩调试平台
  • AI使用指南:9月开学季,自动生成教学PPT