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

vue watch和 watchEffect

在 Vue 3 中,watchwatchEffect 是两个用于响应式地监听数据变化并执行副作用的 API。它们在功能上有一些相似之处,但用途和行为有所不同。以下是对 watchwatchEffect 的详细对比和解释:

1. watch

watch 是一个更通用的 API,允许你监听一个或多个响应式数据源的变化,并在数据变化时执行指定的回调函数。它提供了更多的控制能力,例如可以指定监听的数据源、回调函数的执行时机等。

语法
import { watch } from 'vue';

watch(source, callback, options);
  • source:可以是一个响应式数据源(如 refreactive 对象、getter 函数等)。
  • callback:当监听的数据源发生变化时执行的回调函数。
  • options:可选参数,用于配置 watch 的行为,例如 immediate(是否立即执行回调)、deep(是否深度监听)等。
用途
  • 监听单个数据源:可以监听一个 refreactive 对象的变化。
  • 监听多个数据源:可以同时监听多个数据源的变化。
  • 控制回调的执行时机:通过 options 参数,可以控制回调是否立即执行或是否深度监听。
示例
import { ref, watch } from 'vue';

const count = ref(0);
const name = ref('Kimi');

watch(count, (newVal, oldVal) => {
  console.log(`count changed from ${oldVal} to ${newVal}`);
});

watch([count, name], ([newCount, newName], [oldCount, oldName]) => {
  console.log(`count changed from ${oldCount} to ${newCount}`);
  console.log(`name changed from ${oldName} to ${newName}`);
});

2. watchEffect

watchEffect 是一个更简洁的 API,用于自动收集依赖并执行副作用。它会在首次执行时自动收集依赖,并在依赖变化时重新执行。watchEffect 的行为类似于 watchimmediate: true 模式,即回调函数会在首次执行时立即运行。

语法
import { watchEffect } from 'vue';

watchEffect(callback, options);
  • callback:当依赖的数据源发生变化时执行的回调函数。
  • options:可选参数,用于配置 watchEffect 的行为,例如 flush(控制副作用的执行时机)等。
用途
  • 自动收集依赖watchEffect 会在首次执行时自动收集依赖,并在依赖变化时重新执行。
  • 简化代码:适用于不需要显式指定监听数据源的场景,代码更加简洁。
  • 立即执行:回调函数会在首次执行时立即运行,类似于 watchimmediate: true 模式。
示例
import { ref, watchEffect } from 'vue';

const count = ref(0);
const name = ref('Kimi');

watchEffect(() => {
  console.log(`count is ${count.value}`);
  console.log(`name is ${name.value}`);
});

3. 区别

特性watchwatchEffect
用途监听特定数据源的变化自动收集依赖并执行副作用
回调执行时机默认不立即执行(immediate: false默认立即执行
依赖收集方式显式指定监听的数据源自动收集依赖
控制能力提供更多控制选项(如 immediatedeep 等)更简洁,适合快速实现副作用
适用场景需要监听特定数据源或控制回调执行时机的场景适合不需要显式指定监听数据源的场景

4. 使用建议

  • watch
    • 适用于需要监听特定数据源或控制回调执行时机的场景。
    • 通过 options 参数,可以实现更复杂的监听逻辑,例如深度监听或立即执行。
  • watchEffect
    • 适用于不需要显式指定监听数据源的场景,代码更加简洁。
    • 适合快速实现副作用,特别是在需要立即执行回调的场景中。
http://www.dtcms.com/a/114231.html

相关文章:

  • Linux中C++ gdb调试命令
  • 【多线程】CAS机制
  • 《基于 C++ 的怪物掉落武器功能开发》
  • 19.go日志包log
  • 拍摄的婚庆视频有些DAT的视频文件打不开怎么办
  • JavaScript学习21-事件类型之键盘事件
  • 【STM32】Flash详解
  • Mysql的备份还原
  • 算法刷题记录——LeetCode篇(2.4) [第131~140题](持续更新)
  • OFP--2018
  • 用python输出OLED字模库的符号
  • xLua环境控制+xLua的Lua调用C#的1
  • 数据字典的转换逻辑是什么?是在前端转换,后端 Service 层转换还是在数据库层转换?
  • 柱状图中最大的矩形
  • Graylog 索引配置详解与优化建议
  • 纯个人整理,蓝桥杯使用的算法模板day4(图论 最小生成树问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
  • [论文阅读]PMC-LLaMA: Towards Building Open-source Language Models for Medicine
  • 自然语言处理
  • 《安富莱嵌入式周报》第352期:手持开源终端,基于参数阵列的定向扬声器,炫酷ASCII播放器,PCB电阻箱,支持1Ω到500KΩ,Pebble智能手表代码重构
  • 中国剩余定理
  • AI重构SEO关键词智能布局
  • TS中is关键字详解
  • Day51 | 3. 无重复字符的最长子串、12. 整数转罗马数字、49. 字母异位词分组、73. 矩阵置零
  • Class<?> 和Class<T >有什么区别
  • 设计模式简述(一)设计原则
  • 1.0 软件测试全流程解析:从计划到总结的完整指南
  • C++浅谈转型操作符
  • 看爬山虎学本领 软爬机器人来创新 各种场景能适应
  • @reduxjs/toolkit 报错,解决
  • CF每日5题(1300-1500)