网站托管服务商查询郴州排名优化
网站托管服务商查询,郴州排名优化,万物识别扫一扫,凡科建设网站步骤在 Vue 3 的组合式 API#xff08;Composition API#xff09;中#xff0c;watch 是一个非常核心且强大的工具#xff0c;用于监听响应式数据的变化并执行相应的副作用操作。本文将结合实际代码示例#xff0c;深入讲解 watch 的使用方法、参数配置#xff08;如 deep、…在 Vue 3 的组合式 APIComposition API中watch是一个非常核心且强大的工具用于监听响应式数据的变化并执行相应的副作用操作。本文将结合实际代码示例深入讲解watch的使用方法、参数配置如deep、immediate、常见写法及其应用场景。一、watch 基本用法Vue 3 中的watch函数用于监听响应式引用ref、响应式对象reactive或计算属性computed的变化。其基本语法如下import { watch } from vue watch(source, callback, options?)source要监听的数据源可以是 ref、reactive 对象、getter 函数或由多个上述组成的数组。callback当监听的数据发生变化时触发的回调函数接收新值和旧值作为参数。options可选配置选项如{ deep: true, immediate: true }。二、常见写法与示例分析1. 监听 ref 或 reactive 对象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见下文。2. 使用 getter 函数监听特定属性推荐方式这是最灵活、最常用的方式尤其适用于监听 props、route 等非直接 ref 的数据。示例 1监听 props 中的复杂对象如数组watch( () props.fileList, (newFiles, oldFiles) handleFiles(newFiles, oldFiles), { deep: true } )() props.fileList返回一个 getter 函数确保能正确追踪依赖。deep: true因为fileList很可能是数组或对象内部元素变化不会触发浅层监听必须开启深度监听。回调函数接收新旧值便于做差异处理如上传文件列表变更。 注意如果fileList是一个数组即使你 push 一个新文件浅层监听也不会触发因为数组引用未变。deep: true能解决这个问题。示例 2监听路由路径变化watch( () route.path, (newPath) { activeMenu.value newPath } )route来自vue-router的useRoute()是一个响应式对象。监听route.path可以在用户切换页面时自动更新高亮菜单项。此处无需deep因为path是字符串原始值变化即触发。三、关键配置选项详解1.deep: true—— 深度监听作用监听对象或数组内部属性的变化。适用场景监听嵌套对象、数组、props 中的复杂结构。注意性能开销较大仅在必要时使用。const form reactive({ user: { name: , email: } }) watch(form, (newVal) { // 默认不触发 }, { deep: true }) // 开启后user.name 变化也会触发⚠️ 对于 ref 包裹的对象watch(refObj, ..., { deep: true })也能深度监听。2.immediate: true—— 立即执行作用在侦听器创建时立即执行一次回调。适用场景初始化时就需要根据当前值执行逻辑如根据路由加载数据。watch( () route.query.id, (id) { if (id) fetchDetail(id) }, { immediate: true } )如果不加immediate: true首次进入页面时id存在但不会触发fetchDetail。3. 同时监听多个源watch([refA, refB], ([newA, newB], [oldA, oldB]) { console.log(A or B changed) })四、watch vs watchEffect特性watchwatchEffect是否需要指定依赖✅ 需要显式指定❌ 自动追踪能否访问旧值✅ 可以❌ 不能是否立即执行默认否可用immediate控制✅ 总是立即执行适用场景需要对比新旧值、精确控制依赖初始化 自动依赖追踪通常建议优先使用watch因为它更明确、可控。五、最佳实践建议监听 props 时始终使用 getter 写法() props.xxx对对象/数组变化记得加deep: true需要初始化执行加immediate: true避免在 watch 中修改被监听的值可能引发无限循环及时清理副作用如取消请求可在回调中返回清理函数类似 useEffectwatch(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等选项我们可以精准控制监听行为提升应用的响应性和用户体验。