发布时间:2026/7/15 15:11:06
Vue3:watch和watchEffect详解 Vue3:watch和watchEffect详解1. watch显式监听精准控制1.1 基本用法1.2 监听多个数据源1.3 监听 reactive 对象或特定属性1.4 关键配置选项2. watchEffect自动追踪简洁高效2.1 基本用法2.2 核心特性2.3 清理副作用 (onInvalidate)3. watch vs watchEffect 核心对比4. 最佳实践与避坑指南4.1 何时选择 watch4.2 何时选择 watchEffect4.3 常见陷阱在 Vue 3 的组合式 APIComposition API中watch和watchEffect是处理副作用Side Effects和响应式数据监听的两个核心 API。虽然它们都用于在数据变化时执行逻辑但在依赖追踪方式、执行时机和使用场景上有显著区别。1. watch显式监听精准控制watch需要显式指定要监听的数据源。它默认是惰性执行的即只有在数据变化时才触发并且能够访问数据的新值和旧值。1.1 基本用法watch接收三个参数source监听源、callback回调函数、options配置选项。import{ref,watch}fromvueconstcountref(0)// 监听单个 refwatch(count,(newVal,oldVal){console.log(count 从${oldVal}变为${newVal})})1.2 监听多个数据源可以通过数组形式同时监听多个响应式数据。constfirstNameref(John)constlastNameref(Doe)watch([firstName,lastName],([newFirst,newLast],[oldFirst,oldLast]){console.log(姓名从${oldFirst}${oldLast}变为${newFirst}${newLast})})1.3 监听 reactive 对象或特定属性监听整个 reactive 对象默认情况下修改 reactive 对象的内部属性不会触发 watch除非开启 deep: true。监听特定属性推荐使用 getter 函数可以更精确地监听对象的某个属性且性能更好。import{reactive,watch}fromvueconststatereactive({name:Alice,age:25})// ❌ 错误写法直接监听 reactive 对象修改内部属性通常不触发除非 deepwatch(state,(newVal){...})// ✅ 推荐写法使用 getter 监听特定属性watch(()state.name,(newName,oldName){console.log(名字变了:${oldName}-${newName})})// ✅ 深度监听如果需要监听嵌套对象的所有变化watch(state,(newVal){...},{deep:true})1.4 关键配置选项immediate: true让回调在侦听器创建时立即执行一次。常用于初始化时根据当前值加载数据。deep: true开启深度监听适用于监听对象或数组内部深层属性的变化。注意性能开销较大。flush控制回调执行的时机 (pre,post,sync)。默认pre组件更新前post适合操作 DOM。2. watchEffect自动追踪简洁高效watchEffect会自动追踪回调函数内部使用的响应式依赖。它在创建时会立即执行一次以收集依赖 any之后当任何依赖发生变化时重新执行。2.1 基本用法无需指定监听源只需传入一个副作用函数。import{ref,watchEffect}fromvueconstcountref(0)constdoubleref(0)// 自动追踪 count.valuewatchEffect((){double.valuecount.value*2console.log(count 变化了当前双倍数:${double.value})})2.2 核心特性自动依赖收集函数内用到的所有响应式数据ref, reactive, computed都会自动成为依赖。立即执行默认在组件挂载或创建时立即运行一次用于初始化状态或执行初始副作用。无新旧值参数回调函数不接收参数只能访问当前的最新值。2.3 清理副作用 (onInvalidate)watchEffect提供了一个强大的清理机制用于在处理异步请求、定时器等场景时避免内存泄漏或竞态条件。import{ref,watchEffect}fromvueconstsearchQueryref()constresultsref([])watchEffect((onInvalidate){constquerysearchQuery.valueif(!query){results.value[]return}//模拟异步请求letignoredfalsefetch(/api/search?q${query}).then(resres.json()).then(data{if(!ignored){results.valuedata}})// 清理函数在下一次执行前或停止监听时调用onInvalidate((){ignoredtrue// 取消之前的请求结果处理// 或者 clearTimeout(timer)// 或者 abortController.abort()})})3. watch vs watchEffect 核心对比特性watchwatchEffect依赖追踪显式必须指定监听源隐式自动追踪函数内使用的响应式数据执行时机惰性默认数据变化时才执行立即创建时立即执行一次以收集依赖新旧值访问支持回调接收(newVal, oldVal)不支持只能访问当前最新值适用场景1. 需要对比新旧值2. 监听特定数据源不想执行无关逻辑3. 节流/防抖异步请求4. 需要在数据变化后执行特定操作1. 同步多个状态如表单验证2. 简单的副作用如修改 document.title3. 依赖关系复杂或动态变化的场景4. 初始化时需要立即执行的逻辑性能考量更精准只监听指定源避免不必要的重跑若函数体内依赖过多任何依赖变化都会重跑整个函数4. 最佳实践与避坑指南4.1 何时选择 watch当你需要知道数据是怎么变的新旧值对比。当你只想在特定数据变化时执行逻辑而不希望其他无关响应式数据的变化触发回调。处理异步操作且需要防抖/节流时配合immediate和手动控制。监听props或route的变化并执行一次性副作用。4.2 何时选择 watchEffect逻辑依赖于多个响应式状态且这些状态共同决定一个结果。代码逻辑简单主要是为了同步状态或执行简单的 DOM 操作。希望代码更简洁不想手动维护依赖列表。需要在组件初始化时立即执行某些逻辑如根据初始路由加载数据。4.3 常见陷阱watchEffect 中的异步依赖丢失watchEffect只能追踪同步执行期间访问的响应式数据。如果在异步回调如setTimeout或Promise.then中访问响应式数据这些数据不会被追踪为依赖。// ❌ 错误id 在异步回调中访问不会被追踪watchEffect(async(){constdataawaitfetchData(id.value)// id 的变化不会触发重跑})// ✅ 正确在同步部分访问 idwatchEffect((){constcurrentIdid.value// 同步访问建立依赖fetchData(currentId).then(...)})watch 监听 reactive 对象的误区直接监听reactive对象本身修改其内部属性通常不会触发回调除非使用{ deep: true }。推荐做法是使用 getter 函数监听具体属性watch(() obj.prop, ...)。无限循环风险在watch或watchEffect中修改了被监听的数据可能导致无限循环。务必确保逻辑中有终止条件或避免修改依赖源。总结选watch当你需要精确控制监听谁、需要新旧值、或者进行异步防抖时。选watchEffect当你想要自动追踪依赖、逻辑简单、或者需要立即执行初始化副作用时。在实际开发中两者常互补使用。对于复杂的业务逻辑通常优先使用watch以获得更好的可预测性和性能控制对于简单的状态同步或 UI 副作用watchEffect能显著减少样板代码。

相关新闻

2026/7/15 15:11:06

Vue3中computed详解

Vue3中computed详解1. 核心特性2. 基本用法2.1 只读计算属性(最常用)2.2 可写计算属性3. computed vs methods4. 进阶原理与优化 (Vue 3.4)5. 最佳实践与注意事项6.总结在 Vue 3 中,computed(计算属性)是处理响应式数据…

2026/7/15 15:06:06

EhSyringe:一键让E站说中文的智能翻译解决方案

EhSyringe:一键让E站说中文的智能翻译解决方案 【免费下载链接】EhSyringe E 站注射器,将中文翻译注入到 E 站体内 项目地址: https://gitcode.com/gh_mirrors/eh/EhSyringe 对于广大E站用户来说,语言障碍一直是影响浏览体验的最大痛点…

2026/7/15 15:06:06

计算机小程序毕设实战-基于 Android 的高校学生交流论坛系统 基于 SpringBoot+Android 的校园资讯分享论坛系统的设计与实【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/15 16:16:37

安卓虚拟相机解决方案:Xposed框架下的摄像头替换技术实现

安卓虚拟相机解决方案:Xposed框架下的摄像头替换技术实现 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam 在移动应用开发、隐私保护以及多媒体内容创作领域,安卓虚…

2026/7/15 16:16:37

3大核心功能深度评测:鸣潮工具箱如何重塑你的游戏体验

3大核心功能深度评测:鸣潮工具箱如何重塑你的游戏体验 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 鸣潮工具箱(WaveTools)是一款专为《鸣潮》玩家设计的开源工具集&a…

2026/7/15 16:16:37

【小程序计算机毕业设计案例】基于 SpringBoot + 微信小程序的食堂菜品预约点餐系统 基于 SpringBoot的校园餐饮服务小程序的设计与实现(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/15 16:11:37

从商业广告到纪录片,2026年5个4K视频素材下载网站深度评测

4K视频的使用场景正在不断细分。企业宣传片需要真实的产业和办公镜头,广告短片关注光线与人物表现,纪录片需要稀缺动物、地理和历史素材,社交媒体内容则强调下载速度与制作成本。Wyzowl的2026年调查显示,82%的视频营销人员认为视频…

2026/7/14 12:47:32

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/14 19:23:19

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/14 18:30:06

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/15 0:08:29

【LINUX】驱动

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

2026/7/15 0:08:29

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

2026/7/15 0:08:29

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…

2026/7/15 13:36:32

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…