欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > VUE3的watch()使用场景

VUE3的watch()使用场景

2025/2/22 16:50:03 来源:https://blog.csdn.net/weixin_73060959/article/details/141429141  浏览:    关键词:VUE3的watch()使用场景
  • watch() 默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。
    • 懒执行副作用;
    • 更加明确是应该由哪个状态触发侦听器重新执行;
    • 可以访问所侦听状态的前一个值和当前值。
  • 第一个参数是侦听器的。这个来源可以是以下几种:

    • 一个函数,返回一个值
    • 一个 ref
    • 一个响应式对象
    • ...或是由以上类型的值组成的数组

    第二个参数是在发生变化时要调用的回调函数。这个回调函数接受三个参数:新值、旧值,以及一个用于注册副作用清理的回调函数。该回调函数会在副作用下一次重新执行前调用,可以用来清除无效的副作用,例如等待中的异步请求。

    当侦听多个来源时,回调函数接受两个数组,分别对应来源数组中的新值和旧值。

    第三个可选的参数是一个对象,支持以下这些选项:

    • immediate:在侦听器创建时立即触发回调。第一次调用时旧值是 undefined
    • deep:如果源是对象,强制深度遍历,以便在深层级变更时触发回调。参考深层侦听器。
    • flush:调整回调函数的刷新时机。参考回调的刷新时机及 watchEffect()。
    • onTrack / onTrigger:调试侦听器的依赖。参考调试侦听器。
    • once:回调函数只会运行一次。侦听器将在回调函数首次运行后自动停止。 

    与 watchEffect() 相比,watch() 使我们可以:

  • 示例

    侦听一个 getter 函数:

     
    const state = reactive({ count: 0 })
    watch(() => state.count,(count, prevCount) => {/* ... */}
    )

    侦听一个 ref:

     
    const count = ref(0)
    watch(count, (count, prevCount) => {/* ... */
    })

    当侦听多个来源时,回调函数接受两个数组,分别对应来源数组中的新值和旧值:

     
    watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {/* ... */
    })

    当使用 getter 函数作为源时,回调只在此函数的返回值变化时才会触发。如果你想让回调在深层级变更时也能触发,你需要使用 { deep: true } 强制侦听器进入深层级模式。在深层级模式时,如果回调函数由于深层级的变更而被触发,那么新值和旧值将是同一个对象。

    const state = reactive({ count: 0 })
    watch(() => state,(newValue, oldValue) => {// newValue === oldValue},{ deep: true }
    )

    当直接侦听一个响应式对象时,侦听器会自动启用深层模式:

    const state = reactive({ count: 0 })
    watch(state, () => {/* 深层级变更状态所触发的回调 */
    })

    watch() 和 watchEffect() 享有相同的刷新时机和调试选项:

     
    watch(source, callback, {flush: 'post',onTrack(e) {debugger},onTrigger(e) {debugger}
    })

    停止侦听器:

    const stop = watch(source, callback)// 当已不再需要该侦听器时:
    stop()

    副作用清理:

    watch(id, async (newId, oldId, onCleanup) => {const { response, cancel } = doAsyncWork(newId)// 当 `id` 变化时,`cancel` 将被调用,// 取消之前的未完成的请求onCleanup(cancel)data.value = await response
    })

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com