Vue3 中 computed 计算属性与 watch、watchEffect 监听
1. 引言在 Vue3 开发中computed计算属性和watch监听器是两个非常常用的响应式工具。很多初学者容易混淆它们什么时候用 computed什么时候用 watch两者有什么区别和联系本文用通俗的语言、完整的案例和清晰的对比帮你彻底搞懂这两个属性。2. 什么是 computed 计算属性computed 的核心思想是根据已有的响应式数据派生出一个新的值。它就像一个“自动计算的公式”只要依赖的数据发生变化计算属性就会自动重新计算并且结果会被缓存。通俗理解computed 是“声明式”的你告诉 Vue“我想要什么”Vue 自动帮你算好。它适合用在模板中展示经过加工的数据。2.1 基础案例下面是一个购物车总价的例子template div p商品单价{{ price }} 元/p p购买数量{{ count }} 件/p p总价{{ totalPrice }} 元/p button clickcount增加数量/button /div /template script setup import { ref, computed } from vue const price ref(100) const count ref(1) // 计算属性根据 price 和 count 自动派生总价 // 为什么这里可以写箭头函数呢因为vue3 setup里没有this const totalPrice computed(() { return price.value * count.value }) /script在这个例子中totalPrice不需要手动维护只要price或count变化它就会自动更新。而且只要依赖不变多次访问totalPrice会直接返回缓存结果不会重复计算。2.2 computed 的特点有缓存依赖不变时多次读取不会重复执行计算函数性能更好。只读默认计算属性默认只能读取不能直接修改。如果确实需要修改要使用带 getter 和 setter 的写法。适合模板展示把复杂的逻辑从模板中抽离出来让模板更简洁。下面来证明computed的特点1. 有缓存不重复执行计算函数在模板上调用6次计算属性每调用一次计算方法打印输出1在控制台只输出了一次下面是通过方法来实现发现控制台打印了6次。2. 只读通过getter和setter修改3. 什么是 watch 监听器watch 的核心思想是监听某个数据的变化当它变化时执行一段副作用逻辑。它更像一个“哨兵”一旦发现目标变化就触发你预先定义好的回调函数。和vue2的作用一致但写法有区别。watch 可以监听以下几种情况监视 【ref】定义的【基本类型】数据ref 需要手动开启深度监视监视 【ref】定义的【对象类型】数据,ref 需要手动开启深度监视监视【reactive】定义的【对象类型】数据且默认是开启深度监视的, 并且无法关闭监视 ref 或 reactive 定义的【对象类型】数据中的某个属性监视上述的多个数据什么时候开启深度监视只有要监视对象内部属性时需要开启通俗理解watch 是“命令式”的你告诉 Vue“当某个东西变了去做某件事”。它适合处理异步操作、请求接口、操作 DOM 等有副作用的场景。3.1 基础案例情况一:监视ref定义的【基本类型】数据直接写数据名即可不用写.value但监视的是其value值的改变当监视的值 10, 停止监视watch调用的返回值stopwatch是用于停止监听的函数情况二监视 ref 定义的【对象类型】数据: 直接写数据名监视的是对象的【地址值】若想监视对象内部的数据要手动开启深度监视。若修改整个 ref 定义的对象的属性newValue 和 oldValue 都是新值因为它们是同一个对象。若修改整个 ref 定义的对象newValue 是新值oldValue 是旧值因为不是同一个对象了情况三监视【reactive】定义的【对象类型】数据且默认是开启深度监视的, 并且无法关闭情况四监视 ref 或 reactive 定义的【对象类型】数据中的某个属性注意点如下:1.若该属性值不是【对象类型】需要写成函数形式。2.若该属性值是依然是【对象类型】可直接编也可写成函数不过建议写成函数。1. 监听的属性值不是对象类型监听person对象里的name属性因为name不是对象所以写成函数形式。2.监听的属性值是对象类型2.1 直接写对象的写法可以监听到对象属性里面的某个属性但整个对象无法监听。2.2 函数式可以监听整个对象地址但对象里面的某个属性无法监听。2.3既要监听对象某个属性又要监听整个对象。需要写成函数式然后开启深度监视情况五监视上述的多个数据需要写成数组的形式并且数组里监听的对象要不要写成函数式看监听的是对象还是基本数据类型基本数据类型需要写成函数式对象类型推荐写成函数式。可以看到newValue监听的是整个数组不是数组中某个属性3.2 watch 的特点无缓存每次数据变化都会触发回调没有缓存机制。适合副作用异步请求、DOM 操作、日志记录等场景。可监听多个数据可以同时监听一个或多个响应式数据。支持深度监听监听对象内部属性变化时需要开启deep选项。4. watchEffect 监听器watchEffect 和 watch同样是监听作用区别在于watchEffect会立即执行一次函数并且不需要指定监听哪些对象和属性watchEffect会自动分析监听哪些而watch要指定监听哪些属性和对象才行。下面案例可以看到如果使用watch需要先指定对哪些对象进行监听而watchEffect不需要指定watchEffect会自动帮我们分析监听哪些。5. computed 与 watch 的对比为了更直观地理解两者的区别下面从多个维度进行对比。5.1 核心区别对比表对比维度computed 计算属性watch 监听器核心思想根据已有数据派生新值监听数据变化并执行副作用使用方式声明式告诉 Vue 想要什么命令式告诉 Vue 变化后做什么是否有缓存有缓存依赖不变不重复计算无缓存每次变化都触发返回值返回一个派生值可直接用于模板不返回值只执行回调逻辑适用场景模板中展示加工后的数据异步请求、DOM 操作、复杂逻辑是否支持异步不支持计算函数应为纯函数支持可在回调中执行异步操作能否修改默认只读可配置 setter不涉及修改只负责响应变化5.2 联系与联系点虽然两者用途不同但它们也有紧密的联系都基于响应式系统computed 和 watch 都依赖 Vue3 的响应式机制能自动追踪数据依赖。都能感知数据变化两者都能在依赖数据变化时做出反应只是反应方式不同。可以配合使用在实际项目中经常先用 computed 派生数据再用 watch 监听这个派生结果去执行副作用。5.3 配合使用的案例下面演示 computed 和 watch 如何协同工作script setup import { ref, computed, watch } from vue const price ref(100) const count ref(1) // computed派生总价 const totalPrice computed(() price.value * count.value) // watch监听总价变化执行副作用比如上报埋点 watch(totalPrice, (newTotal) { console.log(总价变化为, newTotal) // 这里可以发送埋点请求或执行其他副作用 }) /script在这个例子中computed 负责“算”watch 负责“听”。当总价变化时watch 自动触发埋点上报两者各司其职、配合默契。6. 如何选择什么时候用哪个选择原则可以总结为一句话需要多次显示用computed而不用方法能用 computed 解决的优先用 computed需要执行副作用的才用 watch。如果只是想展示一个派生值如总价、过滤后的列表、拼接后的字符串用 computed。如果需要在数据变化时执行一段逻辑如请求接口、操作 DOM、保存草稿用 watch。如果既要派生数据又要在派生结果变化时做额外处理两者配合使用。7. 总结computed 和 watch 是 Vue3 响应式体系中的两大核心工具。computed 擅长“算”用声明式的方式从已有数据派生新值自带缓存适合模板展示watch 擅长“听”用命令式的方式监听数据变化并执行副作用适合异步和复杂逻辑。理解两者的区别和联系能让你在开发中写出更清晰、更高效的代码。

相关新闻

Windows性能优化革命:AtlasOS如何让你的电脑快如闪电

Windows性能优化革命:AtlasOS如何让你的电脑快如闪电

Windows性能优化革命:AtlasOS如何让你的电脑快如闪电 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/GitHub_Trending/atlas…

2026/10/13 11:05:00 阅读更多 →
银河麒麟系统JDK安装全攻略:从架构选型到生产环境调优

银河麒麟系统JDK安装全攻略:从架构选型到生产环境调优

1. 项目概述:为什么在银河麒麟上装JDK是个技术活? 如果你是一名在国产化浪潮中摸爬滚打的开发者或运维,手头突然多了一台预装银河麒麟操作系统的机器,而你的Java应用急需部署上去,那么“安装JDK”这个看似基础的操作&…

2026/10/1 23:59:41 阅读更多 →
告别网络烦恼!B站漫画下载器终极指南,轻松打造个人漫画图书馆

告别网络烦恼!B站漫画下载器终极指南,轻松打造个人漫画图书馆

告别网络烦恼!B站漫画下载器终极指南,轻松打造个人漫画图书馆 【免费下载链接】BiliBili-Manga-Downloader 一个好用的哔哩哔哩漫画下载器,拥有图形界面,支持关键词搜索漫画和二维码登入,黑科技下载未解锁章节&#xf…

2026/10/7 14:12:47 阅读更多 →

最新新闻

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

如果你也在Windows上折腾过MySQL,应该能理解那种感受:下载页面一堆版本不知道选哪个,安装到一半卡住,装完了服务起不来,或者换版本时残留文件清不干净,重装总报错。这些坑我基本都踩过一遍,花了…

2026/10/13 11:04:15 阅读更多 →
Thingsboard接入Modbus协议的工程实践与稳定架构设计

Thingsboard接入Modbus协议的工程实践与稳定架构设计

1. 项目概述:为什么一个工业协议接入模块值得单独深挖?“Thingsboard modbus协议”——这六个字背后,不是一句轻飘飘的配置说明,而是一条横跨工业现场与云端管理的真实数据链路。我第一次在某智能配电柜远程监控项目里碰上这个组合…

2026/10/13 11:04:15 阅读更多 →
MySQL与Redis缓存一致性实战:从原理到架构选型

MySQL与Redis缓存一致性实战:从原理到架构选型

做后端这几年,我算是把“缓存和数据库数据对不上”这件事踩透了。团队经常半夜被叫醒,一查原因,十有八九是 Redis 里的旧数据还在服务,而 MySQL 里的记录早就改了。这问题听着朴素,真要讲清楚,背后牵扯到读…

2026/10/13 11:04:15 阅读更多 →
电商数据分析实战:从CLV到营收预测的完整链路

电商数据分析实战:从CLV到营收预测的完整链路

这种预测需求,在如今做电商数据分析的人手里,几乎每周都会撞上一次:老板在周会上盯着营收曲线,问"下个月能不能回到峰值""这批流失客户还值不值得砸券召回";运营拿着用户分群报表,却不…

2026/10/13 11:04:15 阅读更多 →
SpringBoot直连Hive:JDBC接入全流程与常见坑详解

SpringBoot直连Hive:JDBC接入全流程与常见坑详解

最近在给一个数据平台做数据接口,需要让SpringBoot服务通过JDBC直连Hive,把数仓里的离线结果表实时捞过来给前端展示。这个说起来好像就是连个数据库,但实际操作中,Hive和MySQL这些传统关系型数据库在驱动、依赖、协议、会话管理上…

2026/10/13 11:04:15 阅读更多 →
Java全栈演唱会售票系统开发与高并发优化实践

Java全栈演唱会售票系统开发与高并发优化实践

1. 项目概述与核心价值演唱会售票系统是连接演出主办方与观众的关键数字化桥梁。这个基于Java技术栈的全栈解决方案,通过SpringBoot/SSM后端Vue前端uniapp多端的组合架构,实现了从票务管理、在线选座到移动端购票的完整闭环。我在实际票务系统开发中发现…

2026/10/13 11:03:11 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →