【Vue3基础】Vue3中的 computed、watch 和 watchEffect

vue的watch和watchEffect详解 一、前言 在options api中我们采用watch来监听data中的数据或者props中的参数变化。在componsiton api中我们采用watchEffect和watch来进行监听数据变化,并且watchEffect是自动收集依赖,watch则需要我们自己指定需要监听的数据。接下来我们将详细讲解一下composition api中的watchEffect和watch两个api。 二、watchEffect的使用 watchEffect刚开始就会立即执行,并且会自动收集依赖,当其中的依赖项发生改变 阅读详情
AI摘要

Vue3中,computed用于计算属性,仅在依赖变化时更新;watch用于监听响应式数据并在变化时执行回调,支持深度监听和调整触发时机;watchEffect则是一个更简洁的监听方式,自动追踪依赖并立即执行,适用于简单的副作用逻辑。watchEffect的回调可以在同步或异步中运行,但应避免在其中进行大量的数据处理或触发大量更新。

Vue3中的 computed、watch 和 watchEffect

1.watch

1.1 概念

watch用于侦听一个或多个响应式数据源,并在数据源发生变化时调用所给出的回调函数。

官方文档 — watch

1.2 用法

实际上,在 Vue2 中,对于watch的使用是很常见的,所以其基本使用这里就不说了,主要探讨 Vue3 中相较于之前的变化。

在 Vue3 中,原本常用的两种方法,仅适用于用ref创建的响应式数据。

import { watch } from 'vue'

// 监视ref所定义的一个响应式数据
watch(sum,(newValue,oldValue)=>{
	console.log('sum变了',newValue,oldValue)
},{ immediate: true,deep: true })
    
// 监视ref所定义的多个响应式数据,newValue 和 oldValue都是数组
watch([sum,msg],(newValue,oldValue)=>{
	console.log('sum或msg变了',newValue,oldValue)
})

结合官方文档,可以总结如下:

  1. 第一个参数:需要侦听的属性,必须为一个响应式数据。如果不是,则会报错。
  2. 第二个参数:一个回调函数,即如何处理侦听属性的逻辑代码。
  3. 第三个参数:可选参数,类型为对象。
  4. watch可以一次侦听多个响应式属性,只需要将它们放在一个数组中即可。

对于watch中的第三个参数,其要求传入一个对象,其中包括:

  • immediate — 是否立即执行,在 Vue 中,watch默认为懒侦听,即仅在侦听对象发生变化时执行回调。该属性默认为false。当将该属性置为true时,会在**setup函数执行阶段**就会调用一次回调函数,且第一次调用时,回调函数中的oldValue为undefined。
  • deep — 是否开启深度侦听,即当侦听对象为一个具有多层次的响应式对象,其内层属性发生变化时是否能够被侦听到并触发回调。

当侦听对象为一个由ref处理得到的响应式对象,此时如果想要实现深度侦听,需要手动开启深度解析器deep: true。例如:

import { ref,watch } from 'vue'

const deepObj = ref({
  a: [1,3,5,6,[8,7,9]],
  b: '66'
})

setTimeout(()=>{
  deepObj.value.a[4][0] = 9
  console.log(deepObj.value)
},3000)

watch(deepObj,(newValue,oldValue) => {
  console.log(oldValue)
  console.log(newValue)
},{ deep: true })
// 这种情况下不加deep: true,无法触发回调函数
// 加deep: true,触发回调函数

这里实际上也可以看到,当侦听一个对象时,无法正确获取到 oldValue。因为 oldValue 和 newValue 实际上都是是对侦听对象的一个引用,所以实际上此时这两者都指向同一个对象,所以输出是相同的,这也是watch的一个小坑吧。

而当侦听属性是一个由reactive处理得到的响应式对象的话,就会强制开启深度侦听,此时deep配置是无效的。

import { watch, reactive } from 'vue'

const deepObj = reactive({
  a: [1,3,5,6,[8,7,9]],
  b: '66'
})

setTimeout(()=>{
  deepObj.a[4][0] = 9
  console.log(deepObj)
},3000)

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

// 没写deep: true,但还是触发了回调函数
// 加上deep: false,你会发现配置无效,回调函数依旧被调用
1.3 flush与回调的触发时机

总所周知,Vue 组件的更新是异步的,当我们所侦听的属性发生变化时,就可能触发 Vue 组件的更新和侦听回调。

而在默认情况下,侦听的回调会发生在 Vue 组件更新之前。

也就是说,此时我们在侦听回调函数中,所能够访问到的 DOM 是 Vue 组件更新之前的状态。

而实际上,我们在watch的第三个参数中,还可以配置一个属性:flush。通过这个属性,我们可以调整回调函数的调用时机。

flush 可以设定三种值'pre'(默认值)、‘post’、‘sync’。

将其设置为post,即可实现将侦听回调触发时机改为Vue组件更新之后。

1.4 watch侦听reactive处理的响应式数据

需要注意以下两点:

  1. 此时无法获取 oldValue。
  2. 强制开启深度监视(deep配置无效)
// 监视reactive所定义的一个响应式数据
watch(data,(newValue,oldValue)=>{
	console.log('data变化',newValue,oldValue)
})

// 监视reactive所定义的一个响应式数中的某个属性,此时可以获得 oldValue。
watch(()=>data.name,(newValue,oldValue)=>{
	console.log('data变化',newValue,oldValue)
})

// 监视reactive所定义的一个响应式数中的某些属性(同时侦听多个)
watch([()=>data.name,()=>data.age],(newValue,oldValue)=>{
	console.log('data变话',newValue,oldValue)
})

但需要注意的是,这里有一个特殊情况:

// 监视reactive所定义的一个响应式数中的对象属性,此时无法获得oldValue,且 deep 配置有效
// 这也是官方文档深度侦听器有介绍的特殊情况
watch(()=>data.job,(newValue,oldValue)=>{
	console.log('data变了',newValue,oldValue)
},{deep: true})

2.watchEffect

2.1 描述

立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行。watchEffect比watch更简易易用,但是高度的封装意味着它更抽象,没有watch好理解。

官方文档

2.2 用法
import { watchEffect } from 'vue'
// 上来就回调一次
watchEffect(()=>{
    const x1 = sum.value
    console.log('watchEffect所指定的回调执行了')
})

结合官方文档,总结如下:

  1. 不用指明监视哪个属性,监视的回调中用到哪个属性,就会自动追踪哪个属性(和computed类似)
  2. 非惰性侦听,(与默认的watch相反),但是在配置对象中没有像immediate这样的属性控制惰性或非惰性侦听,这也意味着非惰性侦听这个特性无法被更改。
  3. 最多只有两个参数,第一个参数为副作用函数(可以理解为回调函数),第二个是可选参数为配置对象,里面属性下面再说。
  4. 返回值是一个用来停止该副作用的函数。(可以理解为停止侦听器)

对于watchEffect中的第二个参数,要求传入一个对象,其属性有: flush、onTrack / onTrigger

这里主要说flush — 与watch中相同,控制回调执行的时机。

当 flush: posh时,情况和watch的一样,用于控制回调时机。有更方便的别名,用法 ⬇

import { watchPostEffect } from 'vue'

watchPostEffect(() => {
  
})

对于flush: sync,也有更方便的别名,用法⬇

import { watchSyncEffect } from 'vue'

watchSyncEffect(() => {
  
})

而对于flush: sync,官方描述如下:

某些特殊情况下 (例如要使缓存失效),可能有必要在响应式依赖发生改变时立即触发侦听器。这可以通过设置 flush: 'sync' 来实现。然而,该设置应谨慎使用,因为如果有多个属性同时更新,这将导致一些性能和数据一致性的问题。

“在响应式依赖发生改变时立即触发侦听器”,可能有朋友对这点会有疑惑,我每次使用watch、watchEffect侦听响应式属性,每次在打印台都能马上看到打印,不就是说明立即触发了侦听器的副作用函数吗?其实并非如此,这里有必要解释一下,这里缓存的意义。

缓存的概念相信大家都并不陌生,但是此处Vue中的缓存是指什么呢?

我们都早早的在Vue2时学习了**$nextTick的意义,以及Vue更新组件的异步渲染**。同样的, Vue3中也有nextTick这一和$nextTick意义作用对等的东西,甚至熟悉 JS 事件循环机制的朋友知道 eventloop 的一个循环我们称之为 tick。

熟悉上面概念的朋友,理解这里的缓存就十分轻松了,原来 Vue3 会对watchEffect侦听器的副作用函数中的响应式依赖数据作缓存处理。

watchEffect侦听器可能会同时追踪多个响应式数据,当多个响应式数据在同一时间发生变化时,内部会“稍作等待”,观察是否有其他响应式数据发生变化需要触发副作用函数,而最终的结果就是打印台只触发一次副作用函数,反映最终结果。在数据量少、逻辑简单时,“稍作等待”的时间十分短,就会让我们产生“立即触发了侦听器”的错觉。

言归正传,flush: sync就是希望打破这一缓存等待的机制,让其真正意义上的"立即触发侦听器",所以需要谨慎使用。

2.3 watchEffect停止侦听器。

在上面总结的第四点中,说到过watchEffect会返回一个函数,用于停止该副作用函数。

即:

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

// 当不再需要此侦听器时:
stop()

那这个函数有哪些应用的场景呢?

什么应用场景呢?

通常watchEffect需用同步语句创建,他会绑定到当前组件上,在组件销毁时会自动停止侦听,防止内层泄露。同步语句创建其实就是上面的写法,直接在setup中创建注册。

如果用异步语句创建,如用setTimeout函数包裹,则不会自动停止,需要手动停止。

2.4 watchEffect副作用清除

官方给出的例子如下:

watchEffect(async (onCleanup) => {
  const { response, cancel } = doAsyncWork(id.value)
  // `cancel` 会在 `id` 更改时调用
  // 以便取消之前
  // 未完成的请求
  onCleanup(cancel)
  data.value = await response
})

主要要理解好 当中onCleanup的意义,当然这只是个参数名你取什么名字都可以,它是一个用于注册副作用清理的回调函数。

该回调函数会在副作用下一次重新执行前调用,可以用来清除无效的副作用,例如等待中的异步请求。一般是做一些异步请求连发限制或取消请求的操作,保证请求数据的完整和准确性。

3.computed

官方对于computed的描述如下:

接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。

3.1 computed的特性
  1. 在 getter 函数中,在追踪的响应式依赖没有发生变化时,返回都会是上次缓存的数据。(计算属性和方法的区别)
  2. 只有在computed中的响应式依赖发生变化时,才会再次进行运算。

4.三者的区别

  • 参数上,computed只接受一个 getter 函数,watch和watchEffect则不同,需要传入回调的函数。
  • 返回值,computed必须要有个返回值,他会是一个只读的ref对象(最佳实践场景),watch和watchEffect的返回会是一个用于停止侦听的函数。
  • computed、watchEffect都会自动追踪响应式依赖,watch则需要主动追踪响应式依赖。
  • 使用上,computed着重计算,watch和watchEffect着重侦听。从参数上考究,computed没有像watch和watchEffect的配置对象参数去支持调整函数触发时机,官方也说了,在computed的函数中不能做异步请求或者更改 DOM,而watch和watchEffect则相反,十分支持完成类似操作。
Vue3的watch函数中,第三个参数配置对象详细分析 这些是`watch`函数的第三个参数的一些常见配置选项。您可以根据需要选择适当的配置来满足您的需求。 阅读详情

相关推荐

Vue3的computed和watch

watch监控ref数据,深层次监控属性 ,必须手动开启deep:true,不能省略,省略相当于默认 false。watch监控reactive数据,假如需要深层次监控属性需要手动开启deep:true或省略。3.立刻调用 (第三个参数位一个对象,里面可放immediate:true)4.深度监听 (第三个参数位一个对象,里面可放 deep:true)第一个参数监听的数据构成的数组 ​ 第二个参数回调函数。第一个参数:监听的数据 第二个回调函数。基于现有的数据计算出新的数据。1 . 侦听一个数据。

m0_56713342的博客 898

Vue 3 第七章:computed计算属性

computed属性是Vue3中的一个响应式计算属性,它可以根据其他响应式数据的变化而自动更新其自身的值。computed属性可以接收一个计算函数,并在计算函数中使用其他响应式数据的值进行计算。当任何一个参与计算的响应式数据发生变化时,computed属性会自动重新计算其值,并触发相应的依赖更新。

to_the_Future的博客 5万+

vue3学习教程第六节(vue3 中 computed watch watchEffect)

vue 项目中 computed() 、watch() 、watchEffect()的使用以及注意事项

刺客-Andy 的博客 961

vue3中的computed

computed计算属性就是当依赖的属性的值发生变化的时候,才会触发他的更改;如果依赖的值,不发生变化的时候,使用的是缓存中的属性值。

m0_60189088的博客 1万+

基于紫光展锐平台的音频调用到hal层逻辑

基于紫光展锐平台的音频调用到hal层逻辑 1、数据流程图 AudioPolicyService和AudioFlinger的创建: 这两个服务都在audioserver中启动,文件路径: frameworks/av/media/audioserver/main_audioserver.cpp 从AudioFlinger和AudioPolicyService的创建,到output的打开,以及AudioFlinger开始往底层写入数据的具体流程如下图: #mermaid-svg-kjHL4XWwkQXN6NdA

weixin_55053963的博客 1355

UI-TARS本地部署

UI-TARS是一个用于本地部署的交互控制模型,支持桌面应用的自动化操作。部署步骤包括:首先,从官方GitHub仓库下载项目源码和模型checkpoint;其次,使用vLLM框架进行本地模型部署,启动API服务;最后,通过客户端调用API实现功能。部署过程中可能遇到pynvml模块或模型配置问题,提供了相应的解决方案。此外,还支持通过UI-TARS-Desktop客户端进行本地桌面应用的交互控制。整体流程旨在帮助用户快速实现UI-TARS的本地部署与应用。

DYF的博客 2531

Vue3中的computed、watch和watchEffect的区别

先前已经写过Vue3中watch和的文章,可以看这里,该篇文章主要聊聊computed特性以及这三者之间的区别。computed相信大家都不陌生,只是Vue中出现了watch和等侦听器,这三者大多数情景下相同结果的使用体验,使得我们模糊了这三者之前的作用区别。computed又称作,先给段官方描述 ⬇接受一个 getter 函数,。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。computed。

DM_Cxx的博客 1221

大白话,Android Studio安装及其资源分享(离线gradle配置)

安装AndroidAtudio,并通过aliClound镜像与离线gradle配置,来跳过相对“繁文缛节”的过程,直接实现开发

wangzixuanemp的博客 3598

vue3核心语法【三】computed、watch、watchEffect

vue3核心语法之computed、watch使用时常见的五种情况、watEffect、watch与watchEffect的对比

zxz947462113的博客 1784

创建可视化机房

(3)窗户位置创建好以后需要对窗户的墙面镂空位置进行修补,具体操作为,选中镂空位置的顶点(这里必须是选择一个平面的顶点,不要跨平面选择),实际操作如下图:选择点以后,鼠标右键,选择【从顶点创建边/面】,或者按F键,随后对其他镂空位置进行相同操作;(2)将【物体模式】修改为【编辑模式】,选中-x对应面的所有顶点,移动顶点位置,其他放小调整按照同理,找到选中对应面的所有顶点,移动位置即可;调整动画事件轴上的线,选中关键帧的时间,调整模型的位置或者旋转角度,具体根据插入关键帧菜单选择的项进行模型的相关调整。

SmileBu丿㦌的博客 2064

JaCoCo报告聚合的5个常见坑点排查指南:从单模块到多模块的完整避坑手册

本文详细解析了JaCoCo在多模块Maven项目中生成聚合报告时的5个常见问题,包括多模块报告聚合失效、覆盖率数据不一致、增量构建导致的覆盖率丢失等,并提供了具体的配置示例和解决方案。帮助开发者高效排查和解决JaCoCo报告聚合中的各种疑难杂症,提升代码覆盖率分析的准确性和效率。

weixin_27918373的博客 250

Vue Vue3中的 computed、watch、watchEffect

文章目录computedwatch computed <template> 姓:<input v-model="person.firstName"><br/><br/> 名:<input v-model="person.lastName"><br/><br/> <span>全名:{{person.fullname}}</span><br/><br/> &lt

Errol's Blog 785

第二篇:APS智能排产实战:OR-Tools与coptpy从入门到案例

专注于具体的技术实现,包括 OR-Tools 和 coptpy 的详细使用指南、建模技巧、日志解读,以及一个完整的两阶段生产排程案例。适合准备动手开发 APS 系统的工程师和研究者。

算法工程师 454

关于vue3中的computed,watch和watchEffect

​。

2301_76995775的博客 849

记住这两个纯净版Windows11各系列版本系统下载网站

记住这两个纯净版Windows11各系列版本系统下载网站 HelloWindows是一个完整极致的Windows纯净系统下载站,不夹带任何私货,系统全部来源于微软官方原版,本站只是收录官方发布的系统以及工具,方便大家下载,请放心使用。永久在线:www.hellowindows.cn。HelloWindows.cn - 精校 完整 极致 Windows系统下载仓储站。

拥抱具身智能,昇腾Ascend C 7009

验证方法、符合性方法与设计保证的关系

未来,随着适航标准和工程实践的不断演进,验证与符合性方法将持续优化,以应对日益复杂的系统设计需求。设计保证过程中的验证活动具有双重作用,既用于设计过程的质量控制和风险管理,又作为适航符合性方法的重要支持材料。在未来的航空电子系统开发中,进一步优化设计保证与验证活动的协同作用,将有助于应对日益复杂的工程挑战,推动航空安全技术的发展。为了全面理解这二者之间的关系,本章将系统说明设计保证过程中的验证活动如何既服务于设计保证,又作为符合性方法中的核心证明材料。最终,通过功能测试和环境测试验证硬件的实际性能。

qq_41854911的博客 554

Vue3--Watch、Watcheffect、Computed的使用和区别

Vue3--Watch、Watcheffect、Computed的使用和区别

前端工作学习中 1284

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

vue3的watch、watchEffect、computed

在Vue 3中,"副作用" 指的是与组件生命周期之外的操作相关的行为。这通常包括对 DOM 的操作、数据请求、订阅外部事件或资源等。副作用通常在组件的生命周期钩子函数之外执行,比如在。

m0_58118986的博客 275

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【vue3】watch的用法,watch、watchEffect、computed区别

③computed,初始化时就会调用一次,参数为依赖项,依赖项可以是get函数返回计算之后的值(必须),也可以是带有 get 和 set 函数的对象,引用两次,但只会执行最近一次;①watch,在vue3中以组合api方式使用,3个参数(依赖项,回调,deep),依赖项必填,当依赖项更改时会执行回调,;①watch,可获取先前值和当前值,监听范围广可监听data之外的响应对象,可监听一个,也可以多个组合监听,②watchEffect,不能获取先前值,但支持异步和取消异步。),不需要传依赖项,自动收集依赖;

qq_45406325的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Vue3(ref,reactive,setup,computed,watch,watchEffect)

vue2的响应式只有get和set,直接增加属性和删除属性不能得到响应式,要用到this.$set(对象,属性名,值)或者Vue.set()来获得响应式以及this.$delete和Vue.delete,很麻烦。- 语法:const 代理对象= reactive(源对象)```接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)监视对象里的一个属性,必须写成一个箭头函数进行返回,要不然就是死的值,无法进行监视,如果你监视的还是一个对象,必须手动开启深度监视。

internet__的博客 1208

Vue3基础知识-computed、watch、watchEffect

Vue3中的computed、watch、watchEffect用法

2503_91308956的博客 888

【 vue3,computed,watch,watchEffect以及总结,生命周期】

computed有缓存需要返回(用于表单),watch没有缓存,watchEffect有缓存不需要返回。

qq_52722039的博客 236

Vue 3响应式系统全解析:深入ref、reactive、computed、watch及watchEffect

Vue 3的响应式系统以ref和reactive为核心,分别用于基本数据和深度响应式对象。computed提供了自动计算的属性,而watch用于监视数据变化。此外,toRef和toRefs从reactive对象中提取ref,增强了数据响应性。这些API共同简化了Vue 3中动态界面的构建和数据管理。

俎树振的博客 3211

Vue3 计算属性与监听器:computed、watch、watchEffect 用法解析

computed是 “数据加工机”,专注于数据计算与缓存;watch是 “精准哨兵”,专注于特定数据的变化监听;是 “智能管家”,专注于自动追踪依赖的副作用执行。

2203_75550521的博客 2314

第五节: 带你全面理解 vue3 中 computed, watch, watchEffect 组合式API的使用

本章全局讲解vue3 中的computed, watch, watchEffect 组合式API的使用. 通过示例详解三个API 细节部分. 让你对这些知识进行全面的了解.

我们专注于分享最实用的编程技术和干货,帮助你提升编程能力,感谢您的支持和关注! 1438

[Vue3学习笔记]computed+watch+watchEffect

Vue3学习笔记计算属性与监视computed函数watch函数watchEffect函数完整代码 计算属性与监视 computed函数 - 如果传入一个回调,表示是get const fullName1= computed(()=>{ return user.firstName+'_'+user.lastName }) - 如果要有get和set,那需要传入一个对象 const fullName2= computed({ get(){

あなたの可愛い41 1041
上一篇: 【JS进阶】JS内存泄漏
下一篇: 【Vue3基础】ref 和 reactive
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值