watch(source,callback,options)
watchEffect(effect,options)
官方术语:立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行。

 
总结:
watch:
  • 默认仅在监听发生改变时触发回调,设置 immediate:true 可在侦听器创建时立即触发回调。
  • 第一个参数是监听源:source,可以是以下几种

    • 一个函数(getter),返回一个值。这种情况下,默认监听值的子属性,深层监听需要设置{deep:true}。见例子一。
    • 响应式对象----这种情况下,可以深层监听。
    • ref
    • 由以上类型的值组成的数组。
  • 第二个参数是发生变化时要调用的函数:callback。包含三个参数,新值,旧值,一个用于注册副作用清理回调的函数。多个监听源callback的参数,见例子二,获取新旧值,见例子三。第三个参数见下文。
  • 第三个可选的参数是一个对象,支持以下这些选项:
    • immediate:在侦听器创建时立即触发回调。第一次调用时旧值是 undefined
    • deep:如果源是对象,强制深度遍历,以便在深层级变更时触发回调。
    • flush:调整回调函数的刷新时机。默认‘pre’,组件更新之前被调用;‘post’,在组件渲染之后执行,onMounted后,可以访问DOM;‘sync’,监听源发生改变时立即执行(慎,参考例子二,修改了监听源,却只触发了一次callback,设置{ flush: 'sync' },后,会触发两次callback)。
    • onTrack / onTrigger:调试侦听器的依赖。

watchEffect:

  • 默认在侦听器创建时立即触发回调,在执行中收集监听源;在组件更新之前被调用(flush:'pre');
  • 第一个参数是要运行的副作用函数。这个副作用函数的参数也是一个函数,用来注册清理回调。清理回调会在该副作用下一次执行前被调用,可以用来清理无效的副作用。
  • 第二个参数可选的参数是一个对象,支持以下这些选项:
    • flush?: 'pre' | 'post' | 'sync' // 默认:'pre'
    • onTrack?: (event: DebuggerEvent) => void
    • onTrigger?: (event: DebuggerEvent) => void

+++++++++++++++++++++++++++++++++++++++++++++++++++++

:清除副作用函数,用来清理无效的副作用-触发的时机如下:

  • 收集的监听源发生改变时,在下一次副作用函数执行前
  • 监听器被停止(执行stop,或是组件被卸载)

使用场景,一个异步请求没有完成需要取消请求,

watchEffect(async (onCleanup) => {
const { response, cancel } = doAsyncWork(id.value)
// `cancel` 会在 `id` 更改时调用
// 以便取消之前
// 未完成的请求
onCleanup(cancel)
data.value = await response
})

或是防抖,上一个异步请求还没返回,又触发了一次副作用函数(监控用户输入不停的请求后台),需要取消上次的请求,进行新的请求。

+++++++++++++++++++++++++++++++++++++++++++++++++++++

:返回值是一个用来停止该副作用的函数。

const stop = watchEffect(() => {})

// 当不再需要此侦听器时:
stop()

+++++++++++++++++++++++++++++++++++++++++++++++++++++

watchPostEffect()#

watchEffect() 使用 flush: 'post' 选项时的别名。

watchSyncEffect()#

watchEffect() 使用 flush: 'sync' 选项时的别名。

+++++++++++++++++++++++++++++++++++++++++++++++++++++

例子一

const original1 = reactive({ count: { unit: { ccc: 1 } } });
const stop3 = watch(() => original1.count.unit.ccc, (n, o) => {
console.log('触发了original1.count.unit.ccc监听');
})
original1.count.unit.ccc = 2;
//控制台
触发了original1.count.unit.ccc监听 //改为
const original1 = reactive({ count: { unit: { ccc: 1 } } });
const stop3 = watch(() => original1.count.unit, (n, o) => {
console.log('触发了original1.count.unit.ccc监听');
})
original1.count.unit.ccc = 2;
//控制台 无打印 //添加watchOptions {deep:true}
const original1 = reactive({ count: { unit: { ccc: 1 } } });
const stop3 = watch(() => original1.count.unit, (n, o) => {
  console.log('触发了original1.count.unit.ccc监听');
}, { deep:true })
original1.count.unit.ccc = 2;
//控制台
触发了original1.count.unit.ccc监听

例子二

const stop3 = watch([() => original1.count.unit.ccc, original], ([prevN1, prevN], [oldN1, oldN]) => {
console.log('触发了original1.count.unit.ccc监听');
console.log(prevN1, prevN); console.log('触发了original监听');
console.log(oldN1, oldN);
},)
original1.count.unit.ccc = 2
original.count.unit = '*'

浏览打印

 例子三
const original = reactive({ count: { unit: '$' } });
const stop = watch(() => JSON.parse(JSON.stringify(original.count)), (n, o) => {//A watch source can only be a getter/effect
console.log('watch');
console.log(n, o);
}, { deep: true })
original.count.unit = '*'
//浏览器打印
{unit: '*'} {unit: '$'}
 

VUE3 API之watch与watchEffect的更多相关文章

  1. 好久没发文了,一篇Vue3的Composition API使用奉上

    Composition API Composition API是Vue3中推荐的组件代码书写方式,相较于传统的Options API来说,它能让业务逻辑处理和后期代码维护变的更加简单. 首先我们来看O ...

  2. Vue3.0新版API之composition-api入坑指南

    关于VUE3.0 由于vue3.0语法跟vue2.x的语法几乎是完全兼容的,本文主要介绍了如何使用composition-api,主要分以下几个方面来讲 使用vite体验vue3.0 composit ...

  3. Vue3全家桶升级指南一composition API

    1.setup() vue3中的composition API中最重要的就是setup方法了,相当于组件的入口,所有的composition API都必须放到setup()中的使用. setup是在组 ...

  4. vue3 高阶 API 大汇总,强到离谱

    高阶函数是什么呢? 高阶函数英文名叫:Higher Order function ,一个函数可以接收一个或多个函数作为输入,或者输出一个函数,至少满足上述条件之一的函数,叫做高阶函数. 前言 本篇内容 ...

  5. Vue3笔记(二)了解组合式API的应用与方法

    一.组合式API(Composition API)的介绍 官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html 组 ...

  6. Vue2 到 Vue3,重温这 5 个常用的 API

    距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等.虽然目前大多数开发者们在使用的仍旧以Vue2为准,但Vue3显然是Vue开发者们未来必须面对的,而且前不久V ...

  7. 学习 vue3 第一天 vue3简介,创建vue3项目 Composition Api 初识

    前言: 从今天开始来和大家一起学习 vue3 相信大家都不陌生,已经火了一段时间了,但是还是有不少人没有学习,那就跟着六扇老师来简单的入个门 废话不多说,来开始今天的学习 Vue3 简介: 2020年 ...

  8. Vue3实战系列:结合 Ant-Design-of-Vue 实践 Composition API

    Vue 3 出来之后,很多人有如下想法,"又要学新东西啦"."我学不动了"等等. 但是事物总有它的两面性,前端知识更新的很快,利好勤奋好学的同学.计算机行业的迭 ...

  9. vue3.0 的 Composition API 的一种使用方法

    网上讨论的文章已经很多了,这里举一个简单的例子来讨论一下 Composition API 的用法,具体问题才好具体讨论嘛. 假如我们要做一个论坛的讨论列表和分页,以前是把需要的数据都放在data里面, ...

  10. vue3.0 composition API

    一.Setup函数 1.创建时间:组件创建之前被调用,优先与created被调用,this指向的实例为window,created所指向的实例为proxy 2.this指向:不会指向组件实例 3.参数 ...

随机推荐

  1. CentOS安装mysql、MariaDB以及更改数据库存储路径

    注意:此方法只适用于新的机器或没有重要数据库表(可随意删除)的机器安装,如需升级版本参考下方链接!!! https://www.jianshu.com/p/955ff6065935 一.安装操作 1. ...

  2. 树莓派4B安装OPENCV4.0

    参考 : https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/ Step #1: Expand ...

  3. 【KAWAKO】从mac上定时将腾讯云的数据备份到本地

    目录 前言 需求 宝塔面板 备份网站 备份数据库 mac端 创建工程文件夹 rua.py rua stdout plist Reference 前言 不信任一切云端平台,把数据牢牢握在自己手中才是最安 ...

  4. LG P4146 序列终结者

    \(\text{Problem}\) 支持区间加区间翻转区间最大值 \(\text{Solution}\) \(\text{FHQ-Treap}\) 两个标记加与翻转 然后维护区间最大值 \(\tex ...

  5. [EULAR文摘] 超声滑膜炎和腱鞘炎对已获临床缓解患者病情复发的预测

    标签:eular文摘; 超声评估; 病情预测; 腱鞘炎 超声滑膜炎和腱鞘炎对已获临床缓解患者病情复发的预测 Bellis E, et al. EULAR 2015. Present ID:OP0217 ...

  6. Vue3 ref 模板引用获取不到节点

    ref模板引用必须要在组件实例挂载完成之后才可以访问.如果你是在组合式 API 里面写的组件,那么 setup 函数比任何周期函数都早,所以不可能在该函数中执行时获取得到ref--组件实例. 官网关于 ...

  7. 简单使用wireshark

    wireshark抓包工具 拓扑图: 拓扑图解释:终端用户使用wireshark抓包工具监听无线网卡,监听时,终端访问互联网,可实时监听网络抓包 操作步骤: 一,打开wireshark抓包工具,监听网 ...

  8. 2023 年 CCF 春季测试赛模拟赛 - 2

    T1 分治,\(a^b + \dots + 1 = (a^{\lfloor\frac{b}{2}\rfloor} + \dots + 1) \times (a^{\lfloor\frac{b}{2}\ ...

  9. K8s集群调度

    k8s 调度器 Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: 公平:如何保证每个节点都能被分配资源 ...

  10. Appium常见属性和命令

    from appium import webdriverimport time, tracebackdesired_caps = {}desired_caps['platformName'] = 'A ...