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. 【ccc】为了ds的ccc

    补一下之前的笔记: 今日:str!!~~~ 然后还有gets 和 puts 和一些基础的东西 strlen:统计字符串长度   strcpy:将某个字符串赋值到字符数组中    strcat:拼接字符 ...

  2. 调用HttpClient.PostAsync时传token等值

    做内部接口转发时加token验证需要传token值过去,有如下两种方式 string jsonContent = JsonConvert.SerializeObject(args); using(va ...

  3. vue3+element表格数据导出

    实现效果 导出后的效果: 步骤 第一步:安装依赖 npm install --save xlsx file-saver 第二步:给表格添加id,导出的时候需要用到 <!-- 导出按钮 --> ...

  4. MRI病变能否预测已获临床缓解的早期RA未来放射学进展

    MRI病变能否预测已获临床缓解的早期RA未来放射学进展 Tamai M, et al. EULAR 2015. Present ID: FRI0048. 原文 译文 FRI0048 MRI BONE ...

  5. 依那西普减量维持过程中RA病人自报病情复发可能预示未来放射学进展[EULAR2015_SAT0147]

    依那西普减量维持过程中RA病人自报病情复发可能预示未来放射学进展   SAT0147 SELF-REPORTED FLARES PREDICT RADIOGRAPHIC PROGRESSION IN ...

  6. 【译】.NET 7 中的性能改进(七)

    原文 | Stephen Toub 翻译 | 郑子铭 Arm64 在.NET 7中,大量的努力用于使Arm64的代码生成与x64的代码生成一样好或更好.我已经讨论了一些与架构无关的PR,还有一些是专门 ...

  7. Cesium渲染调度

    1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...

  8. ding抓回放

    fiddler 添加代码 var sToInsert = "<script src='https://cdn.jsdelivr.net/gh/Tencent/vConsole@3.8. ...

  9. 信息学奥赛介绍-CSP

    什么是信息学奥赛 信息学奥赛,全称为信息学奥林匹克竞赛,是教育部和中国科协委托中国计算机 学会举办的一项全国青少年计算机程序设计竞赛.主要分为NOIP(全国联赛),夏令营 NOI比赛的扩展赛,也称全国 ...

  10. vue模板三目运算判断报错

    问题: 关于vue三目运算符提示报错 1.三目运算符等于判断 {{ a==b ? '是' : '否'}} 2.其他三目运算符 <代表小于号(<) >代表大于符号(>) ≤表示小 ...