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. Linux06-常用命令 日期 日历 查找 过滤

    1.date  日期 2.cal 日历 3.find 查找 4.locate 查找 5.grep  过滤 1.时间日期类 date指令-显示当前日期 1)指令: date (功能描述:显示当前时间) ...

  2. P13_协同工作_小程序权限管理的概念以及成员管理的两个方面

    协同工作和发布 - 协同工作 了解权限管理需求 在中大型的公司里,人员的分工非常仔细:同一个小程序项目,一般会有不同岗位.不同角色的员工同时参与设计与开发. 此时出于管理需要,我们迫切需要对不同岗位. ...

  3. Istio 升级后踩的坑

    背景 前段时间我们将 istio 版本升级到 1.12 后导致现有的应用监控有部分数据丢失(页面上显示不出来). 一个是应用基础信息丢失. 再一个是应用 JVM 数据丢失. 接口维度的监控数据丢失. ...

  4. TCP/IP协议(4): 地址解析协议(ARP) —— 网络地址转换为物理地址的方式

    TCP/IP协议(4): 地址解析协议(ARP)--网络地址转换为物理地址的方式 关于地址解析协议(Address Resolution Protocol, ARP) 关于 ARP 地址解析协议(Ad ...

  5. Cesium点击改变entity/primitives颜色与恢复原色(三)

    2023-01-08 建筑物是primitives,两个娃娃是entity 加载娃娃代码: //粉色 var entity6 = viewer.entities.add({ id:6, positio ...

  6. K8S 实用工具之一 - 如何合并多个 kubeconfig?

    开篇 引言: 磨刀不误砍柴工 工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群. 如果是第二种情况,是否有一个简单的 kub ...

  7. pyinstaller打包Python程序报错OSError: Python library not found: libpython3.8.so, libpython3.8m.so

    重新编译python(不影响原来安装的库文件),加入--enable-shared ./configure --prefix=/usr/local/python3 --enable-shared然后m ...

  8. vue项目中禁用浏览器缓存配置案例

    项目发布新版本,部署线上后用户浏览器需要清理缓存 1.public文件夹中修改 index.html文件meta配置 <meta http-equiv="Cache-Control&q ...

  9. TCP协议之四次挥手

    参考文章 这里 四次挥手过程 四次挥手的过程是全双工的,因此每个方向都必须要进行单独的关闭,这样原则是当一方完成数据发送后发送一个FIN信号给对方,对方收到FIN后就知道这个方向不会再有数据发送过来了 ...

  10. VMware-安装rpm包出现警告:tigervnc-1.1.0-24.el6.x86_64.

    警告:tigervnc-1.1.0-24.el6.x86_64. 解决方法:rpm -ivh tigervnc-1.1.0-24.el6.x86_64.rpm --force --nodeps --n ...