赞
踩
watch() 默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。
(1)一个 ref
或者一个响应式对象
(2)一个函数,返回一个值
(3)由以上类型的值组成的数组
第二个参数是在发生变化时要调用的回调函数。 这个回调函数接受三个参数:新值、旧值,以及一个用于注册副作用清理的回调函数。 该回调函数会在副作用下一次重新执行前调用,可以用来清除无效的副作用,例如等待中的异步请求。
- //当侦听多个来源时,回调函数接受两个数组,分别对应来源数组中的新值和旧值。
-
- watch([aRef, bRef], ([newA, newB], [prevA, prevB]) => {
- /* ... */
- })
immediate
:在侦听器创建时立即触发回调。第一次调用时旧值是 undefined。
deep
:如果源是对象,强制深度遍历,以便在深层级变更时触发回调。flush
:回调函数的刷新时机。onTrack / onTrigger
:调试侦听器的依赖。pre
(默认)post
sync
onTrack
依赖项被追踪时被调用,只会执行一次。 onTrigger
依赖项变更导致副作用被触发时被调用。只在开发模式下生效。
- const state = reactive({ count: 0 })
- watch(state, () => {
- /* 深层级变更状态所触发的回调 */
- })
watch
只能监听响应式数据:ref
定义的属性和 reactive
定义的对象,如果直接监听 reactive
定义对象中的属性是不允许,只能使用函数转换一下,就是官网说的监听一个 getter。
- const state = reactive({ count: 0 })
- watch(
- () => state.count,
- (count, prevCount) => {
- /* ... */
- },
- {
- deep: true
- }
- )
- const count = ref(0)
- watch(count, (count, prevCount) => {
- /* ... */
- })
立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行
- watchEffect(() => {
- //监听state.str
- console.log(state.str)
-
- // 会在 props 变化时打印
- console.log(a, b, c)
- })
- watchEffect(() => {}, {
- flush: 'post',
- onTrack(e) {
- debugger
- },
- onTrigger(e) {
- debugger
- }
- })
-
1、watchEffect
不支持深度监听,如果监听 reactive
定义的对象是不起作用的,只能监听对象中的属性。3.2
版本以上可以用 watchPostEffect
watchSyncEffect
代替 flush: 'post'
flush: 'sync'。
3、watchEffect
动态加入的依赖不会被清除。watch。
watch。
watchEffect
侦听数据变化写法比较简单,但是不能轻易的操作依赖值,否则会重复触发。watch。
watch。
在 Vue2.x 中, 使用 nextTick, 在Vue3 中,watch / watchEffect 指明 flush: 'post' 选项 即可。
- //watch
- watch(source, callback, {
- flush: 'post'
- })
-
- //watchEffect
- watchEffect(callback, {
- flush: 'post'
- })
-
- //watchEffect也可以使用watchPostEffect
- import { watchPostEffect } from 'vue'
-
- watchPostEffect(() => {
- /* 在 Vue 更新后执行 */
- })
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。