tnblog
首页
视频
资源
登录

Vue 3 中 watch与watchEffect区别

1126人阅读 2024/8/20 22:46 总访问:845677 评论:0 收藏:0 手机
分类: 前端

在Vue 3的Composition API中,watch和watchEffect都是用于侦听响应式数据的变化,但它们之间有一些关键的区别。以下是它们在setup函数中使用的例子和区别说明。

watch

watch函数允许你指定一个或多个响应式数据源,并在这些数据源变化时执行一个回调函数。它提供了一种细粒度的控制,因为你可以精确地指定哪些数据变化时需要触发响应。

  1. <script setup>
  2. import { ref, watch } from 'vue';
  3. const count = ref(0);
  4. watch(count, (newValue, oldValue) => {
  5. console.log(`count changed from ${oldValue} to ${newValue}`);
  6. });
  7. // 或者侦听多个源
  8. const firstName = ref('');
  9. const lastName = ref('');
  10. watch([firstName, lastName], ([newFirst, newLast], [oldFirst, oldLast]) => {
  11. console.log(`Name changed from ${oldFirst} ${oldLast} to ${newFirst} ${newLast}`);
  12. });
  13. </script>

watchEffect

watchEffect函数则会在其依赖的响应式数据变化时重新运行。它不需要你明确指定哪些数据是依赖项,Vue会自动追踪。这使得它在处理有多个依赖项且难以手动指定它们时非常有用。

  1. <script setup>
  2. import { ref, watchEffect } from 'vue';
  3. const count = ref(0);
  4. const doubleCount = computed(() => count.value * 2);
  5. watchEffect(() => {
  6. console.log(`Count is: ${count.value}, doubleCount is: ${doubleCount.value}`);
  7. });
  8. // 当count变化时,上面的watchEffect会重新运行
  9. </script>

区别

细粒度控制:watch允许你精确指定要侦听的数据源,而watchEffect则会自动追踪其执行函数内部的响应式依赖。

执行时机:watch的回调函数是在其侦听的数据源实际变化之后才执行,
而watchEffect则是在组件渲染后和依赖项变化时立即执行。

性能考虑:由于watchEffect会在依赖项变化时重新运行整个函数,因此如果函数内部执行了昂贵的操作,这可能会影响性能。而watch则只会在指定的数据源变化时执行,提供了更好的性能控制。

默认行为:watchEffect在默认情况下,会立即执行一次其回调函数,以捕获初始的依赖项状态(可以通过选项 { immediate: false } 来改变这一行为)。而watch不会立即执行,除非显式地设置 { immediate: true }。

停止侦听:两者都可以通过返回的停止函数来停止侦听。

在选择使用watch还是watchEffect时,你应该根据你的具体需求来决定。如果你需要精确控制哪些数据变化时触发响应,或者希望避免不必要的重新计算,那么watch可能是更好的选择。而如果你希望Vue自动处理依赖项,并且不介意在依赖项变化时重新运行整个函数,那么watchEffect可能更适合你的场景。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

Vue 3入门介绍

一、Vue 3简介Vue.js是一个流行的JavaScript框架,用于构建用户界面。Vue 3是Vue.js的最新版本,它引入了许多新功能和改进...

vue3 跨组件方法调用。Vue 3 的 Provide / Inject mitt

mitt 是一个轻量级的事件发射器(event emitter),它可以很容易地集成到 Vue 3 应用中。 下面是一个使用 Vue 3 的 provid...

Vue 3的Composition API介绍

[TOC]Vue 3 引入了一个新的核心特性,即 Composition API,它提供了一种更灵活、更强大的方式来组织和重用逻辑。与 Vue 2 ...

jsController分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

如何修改CSS存在的element.style内联样式

改腾讯地图的时候调整了下样式,发现样式一直存在问题,修改style里面的值,一点用都没有,html中这个值还找不到是在哪里出...

c、VB.net全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

Java的堆和栈以及堆栈的区别

在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈;  1.栈(stack)...

在问题成长感悟

工作中怎么可能不会遇到问题。遇到问题在去解决问题就会变强。就会有独立解决问题的能力就会独挡一面。技术如此,做商务自...

css单位pxem,rem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

redis主从、哨兵和集群这三个有什么区别

主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。sentinel(哨兵)发现master挂了后,就会从slave中重新选举一个...

JavaScript的事件委托

什么是事件委托事件委托在JavaScript中是非常常见的,它主要用于对某个元素中的子元素的冒泡事件进行监听。JavaScript高级...

类型“DbSet”在未引用的程序集定义。必须添加对程序集“EntityFramework Version=5.0.0.0 Culture=neutral PublicKeyToken=b7

在用mvc+ef的时候在DAL层引用上下文信息的时候会报出下面错误其实就是没得EntityFromwork,打开vs项目,点击工具,选择NuGe...

SQL Server 使用游标

--声明一个游标 DECLAREMyCursorCURSOR FORSELECTTOP5FBookName,FBookCodingFROMTBookInfo//定义一个叫MyCursor的游标,...

正则表达式匹配文标点符号

//匹配这些中文标点符号。?!,、;:“”‘&#39;()《》〈〉【】『』「」﹃﹄〔〕…—~﹏¥ varreg=/[\u3002|\uff1f|\...

判断table表格checkbox 未选的数据

判断table表格中checkbox 未选中的数据 var arrays = $(table).find(&quot;input[name=&#39;sel_sw&#39;]:not(:checked)&qu...
这一生多幸运赶上过你.
排名
8
文章
231
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术