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

Vue 3 中,watch 和 watchEffect 的区别

结论先行: 

watch 和 watchEffect 都是监听器,都是用来监听响应式数据的变化并执行相应操作。区别是: 

watch:需要指明要监听的数据,而且在回调函数中可以获取到属性变化的前后值;

适用于需要精确控制监视范围的情况;也就是需要针对特定数据变化执行操作。

watchEffect:不用指明监听哪个属性,回调中用到哪个响应式数据,那就监听哪个。

适用于不需要明确定义监视的数据,只需在回调函数内部使用响应式数据并执行相应操作的场景。也就是只需根据数据变化自动追踪的操作。

watchEffect 有点像计算属性 computed:但计算属性必须要写返回值,而 watchEffect 更注重的是过程(回调函数的函数体),所以不用写返回值。

而且,computed 若是值没有被使用时不会调用,但是 watchEffect 始终会调用一次。

具体解析: 

watch 和 watchEffect 都是监听器(侦听器)。用来监听响应式数据的变化并执行相应操作

1、watch  

  • 用于对特定的响应式数据进行监视,并在数据变化时执行相应的操作。
  • 需要显式地指定要监视的数据,并提供回调函数来响应数据变化。
  • 除了监视简单的数据变化外,还可以处理更复杂的监视需求,如监听嵌套对象或数组的变化,并执行相应的操作。
  • 具有一定的惰性。第一次页面展示的时候不会执行,只有数据变化的时候才会执行(设置immediate: true 时可以变为非惰性,页面首次加载就会执行)

它接受3个参数:

  • 一个响应式引用 ref 或一个返回值的 getter 函数
  • 一个回调
  • 可选的配置选项
① watch 侦听单个数据源 
import { ref, watch } from 'vue'const counter = ref(0)
watch(counter, (newValue, oldValue) => {console.log('The new counter value is: ' + counter.value)
})

应用到实际例子中:

// src/components/UserRepositories.vue `setup` function
import { fetchUserRepositories } from '@/api/repositories'
import { ref, onMounted, watch, toRefs } from 'vue'export default {components: { RepositoriesFilters, RepositoriesSortBy, RepositoriesList },props: {user: {type: String,required: true}},// 在我们组件中setup (props) {// 使用 `toRefs` 创建对prop的 `user` property 的响应式引用const { user } = toRefs(props)const repositories = ref([])const getUserRepositories = async () => {// 更新 `prop.user` 到 `user.value` 访问引用值repositories.value = await fetchUserRepositories(user.value)}onMounted(getUserRepositories)// 在用户 prop 的响应式引用上设置一个侦听器watch(user, getUserRepositories)return {repositories,getUserRepositories}}
},

在我们的 setup 的顶部使用了 toRefs。这是为了确保我们的侦听器能够对 user prop 所做的更改做出反应

② watch 侦听多个数据源

第一个参数以数组形式传入,第二个参数回调返回的结果也是数组

watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {/* ... */
})

Vue3 中监听 reactive 中的值,必须以 getter 函数 的形式,不然会报错。和 Vue2 的区别是不用写 deep 属性,默认就是深度监听了。 

    watch([result2, () => data.title], (newV, oldV) => {console.log(newV, oldV) //  [20, "111"] [20, "222"]})

 监听 reactive 中的多个值时: 

    watch([result2, () => [data.title, data.value1]], (newV, oldV) => {console.log(newV, oldV)})

2、watchEffect

立即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变更时重新运行该函数。

  • 用于创建一个自动追踪其依赖,并在依赖变化时自动运行的响应式副作用
  • 不需要显式地指定要监视的数据,而是根据回调函数内部使用到的响应式数据自动建立依赖关系。
  • 适用于无需明确定义监视的数据,只需在回调函数内部使用响应式数据并执行相应操作的场景。
  • 立即执行,没有惰性,页面的首次加载就会执行

  • 无法获取到原值,只能得到变化后的值

<template><div><h1>watchEffect - 侦听器</h1><p>{{data.count}}</p><button @click="stop">手动关闭侦听器</button></div>
</template><script>
import { reactive, watchEffect } from "vue";
export default {name: "WatchEffect",setup() {const data = reactive({ count: 1 });const stop = watchEffect(() => console.log(`侦听器:${data.count}`));setInterval(() => {data.count++;}, 1000);return { data, stop };}
};
</script>

 结果:

3、总结  

watch:既要指明要监听的属性,也要指明回调。

watchEffect:不用指明监听哪个属性,回调中用到哪个属性,那就监听哪个属性。

watchEffect 有点像计算属性 computed:

但 computed 注重的计算出来的值(回调函数的返回值),所以必须要写返回值。

而 watchEffect 更注重的是过程(回调函数的函数体),所以不用写返回值。

与 watchEffect 比较,watch 允许我们:

  • 懒执行副作用;
  • 更具体地说明什么状态应该触发侦听器重新运行;
  • 访问侦听状态变化前后的值。

相关文章:

Vue 3 中,watch 和 watchEffect 的区别

结论先行&#xff1a; watch 和 watchEffect 都是监听器&#xff0c;都是用来监听响应式数据的变化并执行相应操作。区别是&#xff1a; watch&#xff1a;需要指明要监听的数据&#xff0c;而且在回调函数中可以获取到属性变化的前后值&#xff1b; 适用于需要精确控制监视…...

鲜花展示服务预约小程序的效果如何

鲜花产品的市场需求度非常高&#xff0c;互联网深入各个行业&#xff0c;很多鲜花商家都会通过线上建立平台实现产品销售、获客引流、转化复购、生意增长等&#xff0c;当然除了搭建鲜花商城小程序外&#xff0c;对鲜花供应商及门店还有展示预约方面的需求。 通过【雨科】平台可…...

Linux下多个盘符乱的问题处理

参考文档&#xff1a; linux下man fstab命令查看帮助&#xff0c;有一段说明&#xff0c;可以使用UUID&#xff0c;或者LABEL 来绑定盘。这里使用UUID来绑定 Instead of giving the device explicitly, one may indicate the filesystem that is to be mounted by its UUID …...

uniapp小程序使用web-view组件页面分享后,点击没有home小房子解决办法

uniapp小程序使用web-view组件页面分享后&#xff0c;点击没有home小房子解决办法 小程序 &#xff1a;IOS 测试正常&#xff0c; 安卓 不显示home 微信小程序使用的是全局自定义导航&#xff0c;通过首页 banner 跳转到一个 web-view 页面&#xff0c;展示官网。 web-view 页…...

SLAM_语义SLAM相关论文

目录 1. 综述 2. 相关文章 Probabilistic Data Association for Semantic SLAM VSO:Visual Semantic Odometry 语义信息分割运动物体...

【技巧】并发读取Mysql数据保证读取到的数据不重复

【技巧】并发读取Mysql数据保证读取到的数据不重复 使用场景: 并发场景下, 保证不获取到重复的数据 思路: 先通过 MYSQL锁 去占位打标识,然后再去取数据 相当于几个人抢蛋糕, A先把蛋糕打上记号 蛋糕是A的, 然后再慢慢吃 表结构 表 t_userid name val used_flag 是否使用…...

Lavarel异步队列的使用

系统为window 启动队列&#xff1a; php artisan queue:listen设置队列类 .env文件需设置&#xff1a;QUEUE_CONNECTIONredis <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Disp…...

JVM知识分享(PPT在资源里)

一、前言 1.自动内存管理 有句经典的话是这样说&#xff0c;Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙&#xff0c;墙外面的人想进去&#xff0c;墙里面的人却想出来。对于Java程序员来说&#xff0c;在虚拟机自动内存管理机制的帮助下&#xff0c;不再需要…...

整合Salesforce Org需要避免的3大风险

管理多个Salesforce实例是成长型企业可能遇到的场景&#xff0c;每个Salesforce实例都包含可能需要整合的关键业务数据和流程。 除了整合&#xff0c;组织可能会在不同的发展阶段采用Salesforce(例如CRM、服务、运营)。整合的最终结果是多个Salesforce实例被统一&#xff0c;并…...

viple进阶3:打印不同形状的三角形

&#xff08;1&#xff09;题目&#xff1a;打印实心的三角形&#xff08;正三角&#xff09; 第一步&#xff1a;观察图形。首行是1颗星&#xff0c;其余的每一行都比上一行多1颗星&#xff1b;其次&#xff0c;每一行的星号数和行数值相等&#xff0c;第一行有1颗星&#xff…...

pytest+yaml实现接口自动化框架

前言 httprunner 用 yaml 文件实现接口自动化框架很好用&#xff0c;最近在看 pytest 框架&#xff0c;于是参考 httprunner的用例格式&#xff0c;写了一个差不多的 pytest 版的简易框架 项目结构设计 项目结构完全符合 pytest 的项目结构&#xff0c;pytest 是查找 test_.…...

编译器使用优化后出现的busfault

遇到的问题&#xff1a; 未开优化是正常执行&#xff0c;打开优化&#xff0c;无法运行&#xff0c;定位到异常语句 //ADC_REG 是ADC结果寄存器地址 uint32 adc *(uint32 *)ADC_REG; uint32 temp adc&0xffff;未优化汇编代码 //uint32 adc *(uint32*)ADC_REG; MOVW R…...

rebase current onto selected作用

rebase current onto selected作用 "rebase current onto selected"是一个版本控制工具中的命令&#xff0c;通常用于将当前分支的修改合并到已选定的分支中&#xff0c;以保持代码库的整洁性和可维护性。 具体来说&#xff0c;这个命令会将当前分支的提交历史记录…...

深度学习入门

全连接批量归一化 目的是&#xff1a;只有一个学习率&#xff0c; 通过归一化&#xff0c;让所有的 x i x_i xi​具有一样的分布&#xff0c;则对每个参数 w i w_i wi​梯度的作用是相当的实现是&#xff1a;实际上是在全连接中增加了两个节点 γ \gamma γ, β \beta β 卷积…...

嵌入式图像处理机器视觉库YMCV使用

YMCV入门 一个可以免操作系统的机器视觉库&#xff0c;由c语言编写可以跑在单片机上。项目地址https://gitee.com/yao_mi/ymcv 使用的时候&#xff0c;可以参考他们的教程和demo&#xff0c;建议先看教程&#xff0c;上面有架构说明。 一个典型的应用就是渲染器&#xff0c;需…...

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…...

10-27 maven概念

maven maven的概念模型: 项目对象模型(POM: Project object Model)&#xff0c;一组标准集合: pom.xml 依赖管理系统(Dependency Management System) 项目生命周期(Project Lifecycle) 项目对象模型&#xff1a; 把项目当成一个对象&#xff0c;描述这个项目&#xff0c;使用p…...

SQL审计是什么意思?目的是什么?有什么好处?

很多刚入行的运维小伙伴对于SQL审计不是很了解&#xff0c;不知道其是什么意思&#xff1f;使用SQL审计的目的是什么&#xff1f;使用SQL审计的好处有哪些&#xff1f;这里我们大家就来一起聊聊&#xff0c;仅供参考哈&#xff01; SQL审计是什么意思&#xff1f; 【回答】&…...

CSS 网页布局

网页布局有很多种方式&#xff0c;一般分为以下几个部分&#xff1a;头部区域、菜单导航区域、内容区域、底部区域&#xff1a; 1&#xff09;、头部区域位于整个网页的顶部&#xff0c;一般用于设置网页的标题或者网页的logo。 <style> body { margin: 0; } /* 头部样…...

智慧燃气管网监测系统功能简要介绍

关键词&#xff1a;智慧燃气、智慧燃气管网、智慧燃气管网监测、智慧燃气管网监测系统、智慧燃气解决方案 燃气作为城市主要燃料&#xff0c;遍布整个城区&#xff0c;其安全运行直接关系到居民的生命安全&#xff0c;不可不重视。 智慧燃气中的GIS和SCADA系统&#xff0c;可…...

深度解析:如何开发一对一交友App的关键要素和流程

在数字化时代&#xff0c;人们越来越倾向于使用交友App来寻找自己的伴侣或交流朋友。而一对一交友App的开发成为了创业者们追逐的热门领域。本文将深入探讨一对一交友App开发的关键要素和流程&#xff0c;帮助您在竞争激烈的市场中脱颖而出。 关键要素&#xff1a;打造独特的用…...

ClickHouse 学习之从高级到监控以及备份(二)

第 一 部分 高级篇 第 1 章 Explain 查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到&#xff0c;并且只能真正执行 sql&#xff0c;在执行日志里面查看。在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成…...

「随笔」IT行业哪个方向比较好就业

一、IT行业就业的PEST分析 在当前的全球经济环境下&#xff0c;IT行业的发展迅速&#xff0c;就业前景广阔。以下从政治、经济、社会和科技四个维度对IT行业就业进行PEST分析。 1.1 政治&#xff08;Political&#xff09; 政府政策&#xff1a;近年来&#xff0c;各国政府都…...

Halcon WPF 开发学习笔记(0):开篇介绍

文章目录 文章专栏Halcon是什么&#xff1f;安装教学视频链接简单来说 Halcon快速开发环境确认新建项目 文章专栏 Halcon开发 Halcon是什么&#xff1f; 史上最全VisionPro和Halcon 的详细对比 Halcon简述 Halcon基础大全&#xff08;基础算子、高阶算子、数组、分割、字符检测…...

SLAM中求导相关的公式总结

李代数与李群的关系 R ˙ R T \dot{R}R^{T} R˙RT 是一个反对称矩阵&#xff0c;所以这个矩阵可以用一个13向量进行反对称来表示 R ˙ R T Φ ^ \dot{R}R^{T}Φ^{\hat{}} R˙RTΦ^ &#xff0c; 根据十四讲 4.8 的推导&#xff0c;最后则有 R ( t ) ˙ Φ ^ ⋅ R ( t ) \d…...

在微信小程序中怎么做投票活动

在当今社交媒体时代&#xff0c;微信小程序已经成为一种广泛使用的互动营销工具。通过各种活动&#xff0c;企业可以吸引用户的关注&#xff0c;提升品牌影响力。其中&#xff0c;投票活动是一种特别受欢迎的形式。本文将为你详细介绍如何在微信小程序中创建投票活动。 一、微信…...

如何使用 NFTScan NFT API 在 Arbitrum 网络上开发 Web3 应用

Arbitrum 是以太坊的 Layer 2 扩容方案&#xff0c;为以太坊面临的高 gas 费和网络拥堵问题&#xff0c;提供了一个解决方案。作为 Layer 1 的以太坊基础层受每秒只能验算 15 笔交易的限制&#xff0c;在目前以太坊使用需求庞大的情况下&#xff0c;局限了以太坊的可扩展性。Ar…...

线上问题排查方法

查看栈信息 先进入docker容器,docker exec -it 容器号 bash *查看线程占用排行top -Hp 1,此处PID为线程号 查看各线程情况jstack -l 1 可以将栈信息生成文件jstack -l 1 > 2.log 查看对应线程号的信息,比如要看线程号PID是28的,那么28的16进制是1C,则检索栈文件里ox1…...

智能柜+MRO:制造业中的自动售货机

每当谈及企业数字化转型&#xff0c;多数人想到的是人工智能、大数据等高端技术的应用&#xff0c;或是原有业务流程和运营方式的数字化与自动化&#xff0c;实现大幅降本增效等。然而&#xff0c;对于急需在数字时代找到生存之道的企业来说&#xff0c;数字化转型的要求远不止…...

flutter笔记:骨架化加载器

flutter笔记 骨架化加载器 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/134224135 【介绍】&#xff1a;本文介…...