Appearance
watch
watch 默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数
watch 总共接收三个参数
第一个参数
监听的数据源,来源如下:
- 一个 getter 函数,返回一个值
- 一个 ref()定义的响应式数据
- 一个 reactive()定义的响应式数据
- 以及由以上类型的值组成的数组
第二个参数
是在监听的数据源发生变化时要调用的回调函数。这个回调函数接受三个参数:新值(newValue)、旧值(oldValue),以及一个用于注册副作用清理的回调函数。该回调函数会在副作用下一次重新执行前调用,可以用来清除无效的副作用,例如等待中的异步请求
js
watch(data, (newValue, OldValue, onCleanup) => {
console.log('数据变化了', `新值是:${newValue}`, `旧值是${OldValue}`)
onCleanup(() => {
console.log('清除副作用')
})
})
当同时监听多个数据源时,回调函数接收两个数组分别对应数据源中的新值和旧值
js
watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {
/* ... */
})
第三个参数
第三个参数是可选参数(options 配置对象),支持以下配置选项
- immediate:在侦听器创建时立即触发回调,第一次调用时旧值是 undefined
- deep:如果数据源时对象,强制深度遍历,(数据源为 reactive 对象会隐式创建一个深层侦听器,且不可通过 {deep: false} 关闭)参考深层监听器
- flush:调整回调函数的刷新时机,值有 3 个,'pre' | 'post' | 'sync'(默认是 pre),顺序为 sync、pre、post
pre:指定的回调应该在渲染前被调用。post:可以用来将回调推迟到渲染之后的,如果回调需要通过 $refs 访问更新的 DOM 或子组件,那么则使用该值。sync:如果值设置为 sync,一旦值发生了变化,回调将被同步调用,它会在 Vue 进行任何更新之前触发(少用,影响性能)
- onTrack/onTrigger:调试侦听器的依赖,当监听项被访问追踪时和更改时触发
js
// 和computed类似,侦听器也支持onTrack和onTrigger
watch(source, callback, {
onTrack(e) {
console.log(e)
debugger
},
onTrigger(e) {
console.log(e)
debugger
}
})
- once:回调函数只会运行一次,侦听器将会在回调函数首次运行后停止