#监听器基本使用
监听器主要为 watch 函数和 watchEffect 函数
#watch 函数基本使用
watch函数第一个参数是watch监听的数据源,一般有以下几种
- 一个ref
- 一个计算属性
- 一个reactive
- 一个getter函数(一个回调函数)
- 包含多个上述数据源的数组
watch函数第二个参数是watch数据源变动时会触发的函数
watch函数第三个参数是配置项
jswacth("依赖", () => {}, {});
watch传入reactive会自动开启深度遍历
如果不希望开启深度遍历,可以用回调函数返回reactive,那么将不会默认开启,而是返回的reactive改变时才会触发watch回调函数。
watch监听一个reactive对象时,默认会给config配置开启deep,即会自动去遍历深层属性的改变,会影响性能。
#watchEffect
watchEffect和watch相比,无需手动指定数据源,而是会自动去寻找watch回调函数中的
响应式依赖,
并且watchEffect会在首次立即执行。js// ref todoId改变时,watchEffect会自动触发,并且初次渲染也会自动触发 watchEffect(async () => { const response = await fetch( `https://jsonplaceholder.typicode.com/todos/${todoId.value}` ) data.value = await response.json() })
#watch 和 watchEffect的取舍
-
watch可以显式指定需要监听的值,能精准控制触发时机
-
watchEffect自动监听需要监听的值,方便,但是代码的依赖关系不能一目了然
-
watch默认第一次不执行,第一次监听数据源改变后才会指向
-
watchEffect默认执行一次
-
watch监听对象的属性,需要使用getter函数返回这个属性,不能直接监听对象的属性(因为对象的属性不是响应式值)
-
watchEffect监听对象的属性,直接在回调函数中写就行了
#watch和watchEffect的配置
- 默认情况下,侦听器将在组件渲染之前执行。设置
flush: 'post'
将会使侦听器延迟到组件渲染之后再执行。即如果要获取更新后的dom,设置flush=post - onTrack和onTrigger是调试用函数,track在依赖项被访问时触发,trigger在依赖项被修改时触发
ts// watch的配置项 export interface WatchOptions<Immediate = boolean> extends WatchOptionsBase { immediate?: Immediate; deep?: boolean; once?: boolean; flush?: 'pre' | 'post' | 'sync'; onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void } // watchEffect的配置项 export interface WatchOptionsBase extends DebuggerOptions { flush?: 'pre' | 'post' | 'sync'; onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void }
#停止watch
- watch和watchEffect会返回一个停止监听函数
- 同步创建的watch,组件销毁时会自动停止