当前位置: 首页 > news >正文

Vue3.5+ 侦听器的3个更新

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。

在 Vue3.5+ 中,对于侦听器的更新有以下几个方面:暂停/恢复侦听器、副作用清理/onWatcherCleanup和deep遍历深度,如果对此熟悉可以直接划走了,如果没有划走就一起看看吧。

暂停/恢复侦听器

在 Vue3.5 之前,watch 和 watchEffect 有一个返回值,为 unwatch,用于停止侦听器,在 Vue3.5+ 中,返回值有所变动,新增了 停止和恢复侦听器的方法。

const { stop, pause, resume } = watch(someRef, () => {})
const { stop, pause, resume } = watchEffect(() => {})// 暂停侦听器
pause()// 稍后恢复
resume()// 停止
stop()

注意,pause 停止侦听器后,可以调用 resume 恢复侦听器,但 stop 是停止侦听器,调用后会清除侦听器,调用 resume 不能恢复!

副作用清理

在 Vue3.5 之前,watch 的第三个参数和 watchEffect 的第一个参数为副作用清理函数,在 3.5+ 中,Vue 提供了一个新方法 onWatcherCleanup,用于清理副作用,使用更方便。

watch

副作用清理:

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

3.5+ 中的副作用清理:

import { onWatcherCleanup } from 'vue'watch(id, async (newId) => {const { response, cancel } = doAsyncWork(newId)onWatcherCleanup(cancel)data.value = await response
})

watchEffect

副作用清理:
watchEffect(async (onCleanup) => {const { response, cancel } = doAsyncWork(newId)// 如果 `id` 变化,则调用 `cancel`,// 如果之前的请求未完成,则取消该请求onCleanup(cancel)data.value = await response
})

3.5+ 中的副作用清理:

import { onWatcherCleanup } from 'vue'watchEffect(async () => {const { response, cancel } = doAsyncWork(newId)// 如果 `id` 变化,则调用 `cancel`,// 如果之前的请求未完成,则取消该请求onWatcherCleanup(cancel)data.value = await response
})

onWatcherCleanup()

注册一个清理函数,在当前侦听器即将重新运行时执行。只能在 watchEffect 作用函数或 watch 回调函数的同步执行期间调用 (即不能在异步函数的 await 语句之后调用)。

示例:

import { watch, onWatcherCleanup } from 'vue'watch(id, (newId) => {const { response, cancel } = doAsyncWork(newId)// 如果 `id` 变化,则调用 `cancel`,// 如果之前的请求未完成,则取消该请求onWatcherCleanup(cancel)
})

deep 设置遍历深度

watch 方法的第三个可选的参数是一个对象,支持的选项其中之一是deep,如果源是对象,强制深度遍历,以便在深层级变更时触发回调。

在 Vue 3.5+ 中,deep 选项还可以是一个数字,表示最大遍历深度——即 Vue 应该遍历对象嵌套属性的级数。

<template><button @click="handleClick">公共组件-输入框</button><p>{{ person }}</p>
</template><script setup>
import { ref, watch } from 'vue';const person = ref({name: 'zhangsan',age: 20,likes: {color: 'blue',fruit: 'apple'}
})watch(person,(newValue, oldValue) => {console.log(newValue, oldValue.value)},{ deep: 1 }
)function handleClick() {// person.value.name += '~'// person.value.age++person.value.likes = {car: 'BYD'}
}
</script>

以上示例代码,知会监听 someObject 数据第一层的变化,即修改name、age和替换likes时,watch的回调才会触发,直接修改likes的color或 fruit 不会触发回调。

注意,深度侦听需要遍历被侦听对象中的所有嵌套的属性,当用于大型数据结构时,开销很大。因此请只在必要时才使用它,并且要留意性能。

好了,分享结束,谢谢点赞,下期再见。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java高级Day43-类加载
  • python压缩图片的代码
  • 基于Spring搭建SpringMvc框架
  • 网络通信开课作业c++
  • 【Go】Go语言中的数组基本语法与应用实战
  • 写作神器!推荐4款AI免费的写论文的文献网站
  • redisController工具类
  • 动态内存管理之malloc,free,calloc和realloc函数
  • Flip动画的实现示例demo
  • mysql的zip解压缩版安装
  • 常见的限流算法
  • hnust 湖科大 毕业实习常见问题30问(2021 年7月,V0.9)
  • django orm增删改查操作
  • 从零到一:构建你的第一个AI项目(实战教程)
  • 【算法】差分思想:强大的算法技巧
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Apache Spark Streaming 使用实例
  • iOS | NSProxy
  • JavaScript函数式编程(一)
  • PaddlePaddle-GitHub的正确打开姿势
  • PHP的类修饰符与访问修饰符
  • Python连接Oracle
  • storm drpc实例
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 通过几道题目学习二叉搜索树
  • 移动端 h5开发相关内容总结(三)
  • 最简单的无缝轮播
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • "无招胜有招"nbsp;史上最全的互…
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • $$$$GB2312-80区位编码表$$$$
  • $refs 、$nextTic、动态组件、name的使用
  • (10)STL算法之搜索(二) 二分查找
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (三)终结任务
  • (一)Docker基本介绍
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .Net OpenCVSharp生成灰度图和二值图
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET开源快速、强大、免费的电子表格组件
  • .NET命令行(CLI)常用命令
  • .NET是什么
  • :“Failed to access IIS metabase”解决方法
  • @ModelAttribute使用详解
  • [ActionScript][AS3]小小笔记
  • [BROADCASTING]tensor的扩散机制
  • [C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换
  • [C#]winform部署yolov5-onnx模型