vue3 监听器,组合式API的watch用法

news2024/11/18 7:45:22

watch函数

在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数

watch(ref,callback(newValue,oldValue),option:{})
ref:被监听的响应式量,可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组
callback:回调函数,当被监听的响应式量变化是触发回调,callback有两个参数,类型和ref一致,值是捕获到的变化后的ref,和变化前的ref
option: 对象提供一些监听函数的监听参数,比如是否开启深层监听

一个最简单的监听示例

<script setup>
import { ref, watch } from 'vue'

const count = ref(0);

watch(count, () => {
  console.log(count.value);
})

</script>

<template>
  <div>
    <span>{{ count }}</span>
  </div>
  <button @click="count++">click</button>
</template>

当按钮点击时count递增,watch函数会捕获count的变化,并触发回调函数打印出count的值

这里 点击了20下每次变化都触发了一次回调

监听getter

<script setup>
import { ref,reactive, watch } from 'vue'

const count = ref(0);
const obj = reactive({num:0});


watch(count, (num) => {
  console.log("count=",num);
})

watch(()=> obj.num , (num) => {
  console.log("sum=",num);
})

</script>

<template>
  <div>
    <span>sum=</span>
    <span>{{ count }}+</span>
    <span>{{ obj.num }}</span>
    
  </div>
  <button @click="count++,obj.num++">click</button>
</template>

这里不能直接监听响应式对象的值(obj.sum ),而是需要用一个返回该属性的 getter 函数要监听的值( ()=> obj.sum ) 

深层监听器

深层侦听需要遍历被侦听对象中的所有嵌套的属性,对于一个对象来说,没有深度监听只有当整个对象改变才会被捕获,

虽然不能直接监听响应式对象的值,但是可以直接监听响应式对象,这会隐式的激活深层监听

  <div>
    <span>sum=</span>
    <span>{{ count }}+</span>
    <span>{{ obj.num }}</span>
    
  </div>
  <button @click="count++,obj.num++">click</button>

const obj = reactive({num:0});

watch( obj, (newValue,oldValue)=>{
  console.log(newValue,oldValue);
})

可以看出来回调的两个对象参数它们式相等的两个值,

当你监听对象内嵌套的对象时,则需要手动开启深层监听,否则只有当整个对象改变时才能被捕获

<div>
  <span>sum=</span>
  <span>{{ count }}+</span>
  <span>{{ obj.num }}</span>
</div>
<button @click="count++,obj.num++,ob.obj.num++">click</button>
<span>嵌套对象的属性{{ ob.obj.num }}</span>
const ob = ref({
  obj:{
    num:0,
    str:"hello"
  },
  count:0
})

watch(()=>ob.value.obj, (newValue,oldValue)=>{
  console.log(newValue,oldValue);
},{
  deep:true
})

 可以看到开启深层监听后就可以捕获到变化响应了

立刻回调和一次回调

{
  deep:true,
  immediate:true,
  once:true
}

除了深层回调还有两个参数,immediate,once,布尔值,它们分别表示,立刻执行一次回调(在开始捕获之前)和只回调一次(只捕获一次响应变化)

watchEffect函数

watchEffect会自动监听能访问到的且发生了响应变化的值,并且只跟踪回调中被使用到的属性,而不是递归地跟踪所有的属性,这有时候比深层监听遍历所有属性要更好,但是要注意,它仅会在其同步执行期间,才b捕获响应变化。在使用异步回调时,只有在第一个 await 正常工作前访问到的属性才会被捕获。

watchEffect(callback(newValue,oldValue),option:{})
callback:回调函数,当被监听的响应式量变化是触发回调,callback有两个参数,类型和ref一致,值是捕获到的变化后的ref,和变化前的ref
option: 对象提供一些监听函数的监听参数,

watch 和 watchEffect

watch 和 watchEffect 都能响应式地执行能响应的回调(触发页面变化)。它们之间的主要区别是追踪响应式依赖的方式:

watch:需要提供监听目标,监听属性更加精确,仅在监听的目标变化时触发

watchEffect: 不需要提供监听补码,监听时没有那么明确,自动追踪所有能访问到的(参与回调的)响应式属性。

<div :style="`background-color:${color}`">
  <span>sum=</span>
  <span>{{ count }}+</span>
  <span>{{ obj.num }}</span>
</div>
<button @click="count++,obj.num++,ob.obj.num++">click</button>
<button @click="color='green'">change</button>
<span>嵌套对象的属性{{ ob.obj.num }}</span>
watchEffect((newValue,oldValue)=>{
  console.log("捕获到了变化",count.value,"\n",newValue,oldValue);
  color.value = "red";
})

 回调中有count,当count变化时直接被捕获,改变了背景颜色,同时它还默认响应了一个函数

 回调触发时机

watchEffect(callback,option:{})

option:
    flush:post/sync (指明post,则会在响应后回调,指明sync,则会在响应前回调)

// 或者你可以用对应的函数;

watchPostEffect()
watchSyncEffect()

// 它们的效果是一样的

如果想在侦听器回调中能访问被 Vue 更新之后的所属组件的 DOM,你需要指明 flush: 'post' 或者使用 watchPostEffect()

如果想在侦听器回调在 Vue 进行任何更新之前触发:你需要指明 flush: 'sync' 或者使用 watchSyncEffect()

停止监听​

在 setup() 或 <script setup> 中,绝大部分的监听器会随着组件销毁而结束。

关键点是,监听器必须用同步语句创建,如果用异步回调创建一个监听器,那么它不会绑定到当前组件上,你必须手动停止它,以防内存泄漏。

手动停止一个侦听器,可以调用 watch 或 watchEffect 返回的函数

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

// ...当该侦听器不再需要时
unwatch()

执行这个返回的函数就可以结束监听,释放内存

代码总结

<script setup>
import { ref,reactive, watch,watchEffect } from 'vue'

const count = ref(0);
const obj = reactive({num:0});
const color = ref("");
const ob = ref({
  obj:{
    num:0,
    str:"hello"
  },
  count:0
})

watch(count, (num) => {
  console.log("count=",num);
})

watch(()=> obj.num , (num) => {
  console.log("sum=",num);
})

watch( obj, (newValue,oldValue)=>{
  console.log(newValue,oldValue);
})

watch(()=>ob.value.obj, (newValue,oldValue)=>{
  console.log(newValue,oldValue);
},{
  deep:true,
  // immediate:true,
  // once:true
})

watchEffect((newValue,oldValue)=>{
  console.log("捕获到了变化",count.value,"\n",newValue,oldValue);
  color.value = "red";
})
</script>

<template>
  <div :style="`background-color:${color}`">
    <span>sum=</span>
    <span>{{ count }}+</span>
    <span>{{ obj.num }}</span>
    
  </div>
  <button @click="count++,obj.num++,ob.obj.num++">click</button>
  <button @click="color='green'">change</button>
  <span>嵌套对象的属性{{ ob.obj.num }}</span>
</template>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1799621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大型零售企业总部到分公司数据发放,有没有更优化的方案?

大型零售企业在市场经济中扮演重要角色&#xff0c;是保证基础商品生产、流通和供给的重要一环。随着企业发展&#xff0c;很多大型零售企业都会在全国、乃至全球各地开设分公司&#xff0c;用以降低生产和运营成本&#xff0c;更好地提供本地化服务。 为了保证总部与分公司间信…

【C++ | 拷贝构造函数】一文了解C++的 拷贝(复制)构造函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-07 2…

Linux.软件操作

1.yum 命令 要连网 2.systemctl 命令控制软件的启动和关闭 3.ln 创建软连接 使用cat来找本体&#xff0c;看看链接生不生效 4.date 命令查看系统时间 格式化的时候可以用双引号把他们引出来 -d 对时间进行修改 修改时区 自动校准 手动校准 5.ifconfig 查看本机的ip地址 6.h…

SOA主要协议和规范

Web服务作为实现SOA中服务的最主要手段。首先来了解Web Service相关的标准。它们大多以“WS-”作为名字的前缀&#xff0c;所以统称“WS-*”。Web服务最基本的协议包括UDDI、WSDL和SOAP&#xff0c;通过它们&#xff0c;可以提供直接而又简单的Web Service支持&#xff0c;如图…

《机器学习特征提取》

书籍&#xff1a;Building Feature Extraction with Machine Learning: Geospatial Applications 作者&#xff1a;Bharath.H. Aithal&#xff0c;Prakash P.S. 出版&#xff1a;CRC Press 书籍下载-《机器学习特征提取》这是一本面向专业人士和研究生的实用指南&#xff0c…

Docker|了解容器镜像层(1)

引言 容器非常神奇。它们允许简单的进程表现得像虚拟机。在这种优雅的底层是一组模式和实践&#xff0c;最终使一切运作起来。在设计的根本是层。层是存储和分发容器化文件系统内容的基本方式。这种设计既出人意料地简单&#xff0c;同时又非常强大。在今天的帖子[1]中&#xf…

PS初级|写在纸上的字怎么抠成透明背景?

前言 上一次咱们讲了很多很多很多的抠图教程&#xff0c;这次继续。。。最近有小伙伴问我&#xff1a;如果是写在纸上的字&#xff0c;要怎么把它抠成透明背景。 这个其实很简单&#xff0c;直接来说就是选择通道来抠。但有一点要注意的是&#xff0c;写在纸上的字&#xff0…

elementui Menu 二级菜单 min-width修改无效

原因&#xff1a;可能是生成的二级菜单样式里面没有带特定的hash属性 而vue代码里面样式里带了 scoped生成的样式有改样式选择器 从而无法成功选择 解决&#xff1a;让样式可以全局选择 不带属性选择器 单文件组件 CSS 功能 | Vue.js :global(.el-menu--vertical .el-menu--p…

【Web API DOM11】节点操作

一&#xff1a;DOM节点 1 什么是DOM节点 DOM树里每一个内容都称为节点 2 DOM节点分类 元素节点 属性节点&#xff1a;a标签的href、img标签的src等 文本节点&#xff1a;标签中的文字 上图为整个DOM树&#xff0c;每个标签、以及标签属性、文本内容构成了DOM树 二&#…

码蹄集部分题目(2024OJ赛18期;并查集+ST表+贪心)

1&#x1f40b;&#x1f40b;史莱姆融合&#xff08;钻石&#xff1b;并查集&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;题目思路 这道题目使用并查集&#xff0c;同一集合的所有元素的最顶上的祖父节点是统一的。…

[NOVATEK] NT96580行车记录仪功能学习笔记

一、u-Boot升级灯 运行u-Boot程序时LED灯闪烁,找到运行过程中一直在运行的函数在里面进行LED引脚电平的翻转 宏定义 Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\include\configs\nvt-na51055-evb.h Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\drivers\mtd\nvt_flash_…

【BOM02】本地存储

一&#xff1a;什么是本地存储 数据存储在用户浏览器中&#xff0c;用户设置、读取方便&#xff0c;同时页面刷新时不会丢失数据。存储在浏览器中数据约5M&#xff0c;分为sessionStorage和localStorage两种存储方式 二&#xff1a;localStorage存储 作用 将数据永久存储在…

idm2024最新完美破解版免费下载 idm绿色直装版注册机免费分享 idm永久激活码工具

IDM 2024破解版重新开发了调度程序和MMS协议支持、重新设计和增强的下载引擎、与所有最新浏览器的独特高级集成、改进的工具栏以及大量其他改进和新功能&#xff0c;这一全新的更新&#xff0c;使得IDM下载器更加完美。值得一提的是&#xff0c;它可以借助油猴浏览器的脚本&…

linux系统——route路由命令

route路由对linux内的ip路由表进行操作 计算机间的数据通信是通过网络来实现的&#xff0c;路由就是从源主机到目标主机的转发过程 路由分为静态路由与动态路由&#xff0c;linux中的均为静态路由&#xff0c;动态路由由交换机路由器自动分配规则而来

2022 hnust 湖科大 javaweb课设 数据库课设 报告+源代码+流程图文件+课设指导书+附赠数据库课堂实验指导书

2022 hnust 湖科大 javaweb课设 数据库课设 报告源代码流程图文件课设指导书附赠数据库课堂实验指导书 描述 湖南科技大学大二下学期先后开展java web和数据库课程设计&#xff0c;两个课设项目可以通用&#xff0c;老师一般会允许自拟选题&#xff0c;所以在此统一打包&…

关于使用南墙waf防护halo网站主页请求404报错的解决方案

文章目录 环境说明问题展示原因探究解决方法 环境说明 在1panel应用商店&#xff0c;部署南墙waf(docker版)halo(2.16.1社区版)注意部署过程中注意uuwaf必须勾选允许外部访问&#xff0c;halo可以不勾选[这里为了证明确实是南墙waf的原因&#xff0c;选择勾选] 问题展示 使…

css实现文字打字机效果

html <body><p class"line animation">我和我的祖国&#xff0c;一刻也不能分割</p> </body>css <style type"text/css">html,body {height: 100%;}body {overflow: hidden;display: flex;justify-content: center;align-i…

D3D 顶点格式学习

之前D3D画三角形的代码中有这一句&#xff0c; device.VertexFormat CustomVertex.TransformedColored.Format; 这是设置顶点格式&#xff1b; 画出的三角形如下&#xff0c; 顶点格式是描述一个三维模型的顶点信息的格式&#xff1b;可以包含以下内容&#xff0c; 位置…

算法:前缀和题目练习

目录 题目一&#xff1a;一维前缀和[模版] 题目二&#xff1a;二维前缀和[模版] 题目三&#xff1a;寻找数组的中心下标 题目四&#xff1a;除自身以外数组的乘积 题目五&#xff1a;和为K的子数组 题目六&#xff1a;和可被K整除的子数组 题目七&#xff1a;连续数组 题…

【工具】Vmware17 安装mac(13.6.7)虚拟机

目录 0.简介 1.环境 2.详细步骤 2.1下载mac镜像&#xff08;可以选择你所需要的&#xff09; 2.2 VMware安装 1&#xff09;创建新的虚拟机 2&#xff09;选择【典型】&#xff0c;点击下一步 3&#xff09;选择【安装程序光盘映像文件】&#xff0c;点击浏览&#xff…