RAE递归对抗引擎与拓扑缺陷检测深度耦合研究报告(世毫九实验室原创研究)
2026/7/13 15:33:44
在 Vue 3 的组合式 API(Composition API)中,watch是一个非常核心且强大的工具,用于监听响应式数据的变化并执行相应的副作用操作。本文将结合实际代码示例,深入讲解watch的使用方法、参数配置(如deep、immediate)、常见写法及其应用场景。
Vue 3 中的watch函数用于监听响应式引用(ref)、响应式对象(reactive)或计算属性(computed)的变化。其基本语法如下:
import { watch } from 'vue' watch(source, callback, options?){ deep: true, immediate: true }。const count = ref(0) watch(count, (newVal, oldVal) => { console.log(`count 从 ${oldVal} 变为 ${newVal}`) })对于 reactive 对象,若只监听整个对象(而非深层属性),默认不会触发深层监听:
const user = reactive({ name: 'Alice', age: 25 }) // ❌ 这样不会监听到 user.name 的变化! watch(user, (newVal, oldVal) => { // 不会触发 })此时需要开启deep: true(见下文)。
这是最灵活、最常用的方式,尤其适用于监听 props、route 等非直接 ref 的数据。
watch( () => props.fileList, (newFiles, oldFiles) => handleFiles(newFiles, oldFiles), { deep: true } )() => props.fileList:返回一个 getter 函数,确保能正确追踪依赖。deep: true:因为fileList很可能是数组或对象,内部元素变化不会触发浅层监听,必须开启深度监听。💡 注意:如果
fileList是一个数组,即使你 push 一个新文件,浅层监听也不会触发,因为数组引用未变。deep: true能解决这个问题。
watch( () => route.path, (newPath) => { activeMenu.value = newPath } )route来自vue-router的useRoute(),是一个响应式对象。route.path可以在用户切换页面时自动更新高亮菜单项。deep,因为path是字符串(原始值),变化即触发。deep: true—— 深度监听const form = reactive({ user: { name: '', email: '' } }) watch(form, (newVal) => { // 默认不触发 }, { deep: true }) // 开启后,user.name 变化也会触发⚠️ 对于 ref 包裹的对象,
watch(refObj, ..., { deep: true })也能深度监听。
immediate: true—— 立即执行watch( () => route.query.id, (id) => { if (id) fetchDetail(id) }, { immediate: true } )如果不加immediate: true,首次进入页面时id存在但不会触发fetchDetail。
watch([refA, refB], ([newA, newB], [oldA, oldB]) => { console.log('A or B changed') })| 特性 | watch | watchEffect |
|---|---|---|
| 是否需要指定依赖 | ✅ 需要显式指定 | ❌ 自动追踪 |
| 能否访问旧值 | ✅ 可以 | ❌ 不能 |
| 是否立即执行 | 默认否(可用immediate控制) | ✅ 总是立即执行 |
| 适用场景 | 需要对比新旧值、精确控制依赖 | 初始化 + 自动依赖追踪 |
通常建议优先使用watch,因为它更明确、可控。
() => props.xxxdeep: trueimmediate: truewatch(someRef, async (id) => { const cancelToken = axios.CancelToken.source() try { await axios.get(`/api/data/${id}`, { cancelToken: cancelToken.token }) } catch (e) { if (!axios.isCancel(e)) throw e } // 返回清理函数 return () => cancelToken.cancel() })watch是 Vue 3 组合式 API 中处理副作用和响应式数据联动的核心工具。通过合理使用deep、immediate等选项,我们可以精准控制监听行为,提升应用的响应性和用户体验。