【学习】VUE中的watch监听
一、watch概述
(一)什么是watch?
- watch是Vue中的一个特性,用于监听数据的变化并执行相应的操作。
- 当被监听的数据发生变化时,会触发一个回调函数,我们可以在这个回调函数中执行一些逻辑操作。
- watch适用于需要在数据变化时执行异步或开销较大的操作的场景。
(二)基本语法
1. 选项式API(Options API)中的watch
1 |
|
2. 组合式API(Composition API)中的watch
1 |
|
二、watch的高级用法
(一)深度监听
1. 监听对象的深层属性变化
- 默认情况下,watch只会监听对象的引用变化,而不会监听对象内部属性的变化。
- 如果需要监听对象内部属性的变化,需要设置
deep: true
。
1 |
|
2. 监听对象的特定属性
1 |
|
(二)立即执行
- 默认情况下,watch只会在数据变化时触发回调函数,而不会在初始化时执行。
- 如果需要在初始化时就执行一次回调函数,可以设置
immediate: true
。
1 |
|
(三)一次性监听
- 在Vue 3.2+版本中,可以使用
once: true
选项来设置只监听一次变化。 - 或者使用
watchEffect
的onInvalidate
函数来手动停止监听。
1 |
|
三、watchEffect
(一)watchEffect与watch的区别
watch
需要明确指定要监听的数据源,而watchEffect
会自动收集其内部所使用的所有响应式依赖。watch
可以访问被监听状态的前一个值和当前值,而watchEffect
只能访问当前值。watchEffect
会在组件初始化时立即执行一次,相当于设置了immediate: true
的watch。
1 |
|
(二)停止监听
- watchEffect返回一个停止函数,调用它可以停止监听。
1 |
|
四、watch与computed的区别
特性 | watch | computed |
---|---|---|
用途 | 监听数据变化并执行副作用 | 计算并返回新值 |
缓存 | 无缓存机制 | 有缓存,只在依赖变化时重新计算 |
返回值 | 无返回值 | 有返回值 |
适用场景 | 数据变化时执行异步操作或复杂逻辑 | 依赖其他数据计算出新值 |
执行时机 | 数据变化后执行 | 依赖变化时立即计算新值 |
五、实际应用场景
(一)表单验证
1 |
|
(二)搜索防抖
1 |
|
(三)路由参数变化监听
1 |
|
(四)响应式数据持久化
1 |
|
六、注意事项
- 避免在watch回调中修改被监听的值,这可能导致无限循环。
- 深度监听可能会影响性能,特别是监听大型对象时,应谨慎使用。
- watch不会监听数组的索引变化和对象的添加/删除属性,除非使用Vue提供的方法(如
push
、splice
、Vue.set
等)。 - 在组合式API中,确保在
setup
或生命周期钩子中设置watch,避免在条件语句或循环中创建watch。 - 使用
watchEffect
时要注意副作用清理,特别是涉及到DOM操作或异步操作时。