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

Vue 3 Watch 进阶指南:从基础进阶到 Vue 3.5 新特性全掌握

在 Vue 3 开发中,watch 是我们处理副作用(如异步请求、DOM 操作、数据同步)的核心武器。随着 Vue 3.5 版本的发布,侦听器又迎来了一些非常实用的更新。本文将带你从零开始,深度拆解 watch 的所有高阶用法与避坑指南。


一、 Watch 的核心定义

watch 的本质是懒执行的副作用函数。它侦听一个或多个响应式数据源,当数据发生变化时执行回调。

为什么选 watch 而不是 watchEffect

  • 精确性:明确指定触发源,不会像 watchEffect 那样追踪每一个读取到的变量。
  • 回溯性:可以访问变化前后的值(newValueoldValue)。
  • 可控性:默认不立即执行,只有数据变了才触发。

二、 五种侦听源类型

在 Vue 3 中,watch 的第一个参数非常灵活:

import { ref, reactive, watch, computed } from 'vue'const count = ref(0)
const state = reactive({ name: 'Gemini', age: 1 })
const double = computed(() => count.value * 2)// 1. 直接侦听 Ref
watch(count, (v) => console.log('Ref 变了:', v))// 2. 侦听 Getter 函数 (最推荐,尤其是针对响应式对象的某个属性)
watch(() => state.age, (v) => console.log('年龄变了:', v))// 3. 侦听 Reactive 对象 (默认强制开启深度监听)
watch(state, (v) => console.log('State 变了'))// 4. 侦听计算属性
watch(double, (v) => console.log('计算属性变了:', v))// 5. 侦听多个源 (数组形式)
watch([count, () => state.name], ([newCount, newName]) => {console.log('组合监听:', newCount, newName)
})

三、 配置选项 (Options) 解析

watch 的第三个参数是一个对象,决定了侦听器的行为:

选项 类型 说明
immediate boolean 是否立即触发一次(此时 oldValueundefined)。
deep boolean / number 是否深度遍历。Vue 3.5 后支持传入数字代表遍历层级。
flush `'pre' 'post'
once boolean (Vue 3.4+) 仅触发一次,随后自动停止。

注意:侦听一个 reactive 对象时,deep 默认为 true


四、 核心避坑指南 (必读)

1. 为什么我的 oldValue 和 newValue 一模一样?

当你侦听一个引用类型(如对象或数组)时,newValueoldValue 指向的是同一个引用。

  • 解决办法:如果必须获取旧值的镜像,请在 Getter 中返回该对象的浅拷贝/深拷贝
watch(() => ({...state}), (newVal, oldVal) => {console.log(newVal.age, oldVal.age) // 此时两者不同
})

2. 停止侦听器

在组件 setup 中声明的 watch 会随组件卸载自动停止。但如果你在异步回调(如 setTimeout)中创建了 watch,它会变成“孤儿”,导致内存泄漏。

  • 解决办法:手动调用返回的停止函数。
const unwatch = watch(source, cb)
// 逻辑结束后
unwatch()

五、 副作用清理:从 onCleanup 到 Vue 3.5 onWatcherCleanup

在侦听器中处理异步请求时,如果上一次请求还没结束,新请求又发起了,我们需要清理掉旧的请求。

传统写法 (3.5 以前)

watch(id, (newId, oldId, onCleanup) => {const controller = new AbortController()fetchData(newId, controller.signal)onCleanup(() => controller.abort()) // 下次执行前清理
})

Vue 3.5 最新写法

Vue 3.5 引入了全局导出的 onWatcherCleanup,它不仅可以在 watch 中使用,也能在 watchEffect 中使用,且不需要修改回调函数的参数签名。

import { watch, onWatcherCleanup } from 'vue'watch(id, (newId) => {const timer = setTimeout(() => {console.log('执行任务')}, 1000)// 更加优雅的清理方式onWatcherCleanup(() => clearTimeout(timer))
})

六、 最佳实践建议

  1. 优先使用 Getter 函数:即便监听的是 Ref,使用 () => count.value 也能保持一致的代码风格,且能避免一些复杂的类型推导问题。
  2. **谨慎使用 deep: true**:对于超大型对象,深度监听会带来明显的性能开销。
  3. **善用 flush: 'post'**:如果你在回调里需要通过 ref 获取 DOM 元素的最新高度、宽度,记得开启这个选项。

结语

Vue 3 的 watch 远比想象中强大。理解了 Getter 的必要性引用类型的坑 以及 3.5 的清理新特性,你就能写出更健壮、更优雅的响应式逻辑。

http://www.jsqmd.com/news/183776/

相关文章:

  • 科研写作智能化:9款AI工具深度解析,高效生成开题报告与论文初稿
  • 学术写作进入AI时代:9款智能工具实测,开题报告与论文初稿速成指南
  • 吐血推荐专科生必用9款AI论文软件
  • LeetCode 63:Unique Paths II - 带障碍网格路径问题的完整解析与面试技巧
  • AI革新学术写作方式,9款精选智能工具实现论文高效产出
  • OCSSA-VMD-Transformer-LSTM-Adaboost轴承故障诊断MATLAB代码实现
  • 科沃斯x11pro的优缺点
  • 技术文章大纲:Anaconda加速AI模型训练
  • 2026广东厨师中式烹调师报考学校排名及职业认证机构培训课程推荐白皮书 - 品牌企业推荐师(官方)
  • 9款AI写作工具横评:学术研究从开题到初稿的智能化解决方案
  • AI应用架构师实战:体育行业AI赛事决策系统的架构设计
  • IDM插件开发创意赛技术文章大纲
  • 2026年广东保育师认证机构课程推荐与优质培训学校综合排名白皮书 - 品牌企业推荐师(官方)
  • CSDN官网热议:VoxCPM-1.5-TTS-WEB-UI是否将颠覆传统语音合成方式?
  • 学术写作迎来智能化突破,9款AI工具实测加速开题与论文创作
  • 2026年广东健康管理师培训学校排名与认证机构课程推荐白皮书 - 品牌企业推荐师(官方)
  • AI驱动学术写作升级,9款精选工具提供从构思到成稿的全流程支持
  • blender 开放exec接口的插件
  • D. Interval Cubing
  • 学霸同款10个AI论文写作软件,助你轻松搞定本科论文!
  • 把IP地址转换为字符串
  • BKA-Transformer-LSTM多变量时间序列预测Matlab实现
  • AI技术正在重塑学术写作,精选9款工具评测为研究提供智能化支持
  • 基于空间矢量控制的永磁同步电机状态反馈控制转速系统设计及仿真(含仿真平台、设计文档及高清仿真结果)”
  • 一次讲透 !、、||:90% 的条件判断 Bug 都出在这里
  • 餐厅菜单语音化:顾客扫描二维码听取VoxCPM-1.5-TTS-WEB-UI菜品介绍
  • 软考高项:这六类人为何屡战屡败?如何破解困局?
  • Vue3 应用实例创建及页面渲染底层原理
  • 学长亲荐!专科生必看TOP8 AI论文写作软件测评
  • Sonic提供人脸脱敏功能防止敏感信息泄露