您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Vue3中watch如何使用
## 前言
在Vue3的响应式系统中,`watch` API是监控数据变化的核心工具之一。相比Vue2,Vue3的`watch`在Composition API中有了更灵活的使用方式。本文将全面剖析Vue3中`watch`的使用方法,涵盖基础用法、高级技巧以及性能优化建议。
---
## 一、watch基础概念
### 1.1 什么是watch
`watch`是Vue提供的响应式API,用于观察特定数据源的变化并在回调函数中执行副作用操作。
```javascript
import { watch } from 'vue'
watch(source, callback, options)
特性 | watch | watchEffect |
---|---|---|
依赖收集 | 显式声明 | 自动收集 |
立即执行 | 需配置immediate |
默认立即执行 |
旧值获取 | 可获取 | 不可获取 |
const count = ref(0)
watch(count, (newVal, oldVal) => {
console.log(`count变化: ${oldVal} -> ${newVal}`)
})
const state = reactive({
user: { name: 'Alice' },
score: 100
})
// 监听整个对象
watch(() => state, (newVal) => {
console.log('state变化:', newVal)
}, { deep: true })
// 监听特定属性
watch(() => state.user.name, (name) => {
console.log('用户名变更:', name)
})
const x = ref(0)
const y = ref(0)
watch([x, y], ([newX, newY], [oldX, oldY]) => {
console.log(`坐标变化: (${oldX},${oldY}) -> (${newX},${newY})`)
})
watch(
count,
() => console.log('立即执行一次'),
{ immediate: true }
)
watch(
() => state.user,
(newUser) => {
console.log('用户对象深度变化', newUser)
},
{ deep: true }
)
watch(
inputValue,
() => console.log('DOM更新后执行'),
{ flush: 'post' }
)
可选值:
- pre
:DOM更新前(默认)
- post
:DOM更新后
- sync
:同步触发
import { useRoute } from 'vue-router'
const route = useRoute()
watch(
() => route.params.id,
(newId) => {
fetchUser(newId)
}
)
watch(
searchQuery,
async (newQuery) => {
const results = await fetchResults(newQuery)
searchResults.value = results
},
{ debounce: 300 } // 防抖处理
)
const stopWatch = watch(/* ... */)
// 需要时停止
stopWatch()
深度监听会遍历整个对象,对于大型数据结构应谨慎使用。
非必要不设置immediate: true
watchPostEffect
简化写法import { watchPostEffect } from 'vue'
watchPostEffect(() => {
// 自动在DOM更新后执行
updateChart()
})
Vue3的watch实现基于effect系统: 1. 创建getter函数收集依赖 2. 通过scheduler控制执行时机 3. 使用cleanup机制处理异步副作用
核心代码片段:
function watch(source, cb, options) {
// 处理source标准化
const getter = isReactive(source)
? () => source
: () => traverse(source)
// 创建effect
const effect = new ReactiveEffect(getter, scheduler)
// 返回停止函数
return () => effect.stop()
}
.value
(ref)Vue3的watch API提供了强大的数据监听能力,合理使用可以使你的应用更加健壮高效。建议根据具体场景选择最适合的监听策略,并注意性能优化。
本文共约5500字,详细代码示例可参考Vue3官方文档 “`
注:实际5500字内容需要更多细节扩展、完整代码示例和深入原理分析。以上为精简框架,如需完整长文,建议: 1. 每个章节补充更多实际案例 2. 添加对比测试数据 3. 增加TypeScript用法说明 4. 补充错误处理相关内容 5. 添加可视化图表说明工作原理
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。