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

Vue学习笔记集--watch

watch

在 Vue 3 的 Composition API 中,watchwatchEffect 是用于响应式侦听数据变化的核心 API。它们都能追踪依赖并执行副作用,但在使用方式和场景上有显著差异。以下是详细解析:


watchwatchEffect 对比

特性watchwatchEffect
依赖收集方式显式指定侦听的数据源自动收集回调函数内的响应式依赖
立即执行默认不立即执行(可通过 immediate: true 开启)总是立即执行
旧值访问可获取旧值(oldValue无法获取旧值
适用场景需要精确控制侦听目标依赖多个数据或需要自动追踪依赖的场景

watch 的深度解析

1. 基本语法
import { watch, ref } from 'vue';const count = ref(0);// 监听单个 ref
watch(count, (newVal, oldVal) => {console.log(`count变化:${oldVal}${newVal}`);
});// 监听多个源(数组形式)
watch([count, otherRef], ([newCount, newOther], [oldCount, oldOther]) => {// 处理多个变化
});
2. 监听不同类型的数据源
  • Ref 类型

    const num = ref(0);
    watch(num, (newVal) => { /* ... */ });
    
  • Reactive 对象属性

    const state = reactive({ user: { name: 'Alice' } });
    watch(() => state.user.name, // 使用 getter 函数(newName) => { /* ... */ }
    );
    
  • 深层监听对象/数组

    watch(() => state.user,(newUser) => { /* ... */ },{ deep: true } // 深度监听嵌套属性变化
    );
    
3. 配置选项
选项说明
deep: true深度监听对象/数组的内部变化
immediate: true立即触发回调(类似 Vue 2 的 immediate
`flush: ‘pre’‘post’
watch(source,callback,{ deep: true, immediate: true, flush: 'post' }
);

watchEffect 的深度解析

1. 基本用法
import { watchEffect, ref } from 'vue';const count = ref(0);// 自动追踪依赖
watchEffect(() => {console.log(`count的值:${count.value}`);
});count.value = 1; // 输出 "count的值:1"
2. 特点
  • 自动依赖追踪:回调函数中使用的响应式变量会被自动追踪。
  • 立即执行:初始化时立即运行一次。
  • 无需指定依赖:适合依赖多个响应式变量的场景。
3. 停止侦听器

通过调用返回的函数停止侦听:

const stop = watchEffect(() => { /* ... */ });
stop(); // 手动停止侦听
4. 清理副作用

在回调中返回一个清理函数,用于重置操作(如取消请求):

watchEffect((onCleanup) => {const timer = setTimeout(() => {// 异步操作}, 1000);onCleanup(() => clearTimeout(timer)); // 清理函数
});

使用场景对比

1. 使用 watch 的场景
  • 需要精确控制侦听的目标
  • 需要获取旧值进行比较。
  • 需要延迟执行(默认不立即执行)。
  • 需要深度监听对象/数组
2. 使用 watchEffect 的场景
  • 依赖多个响应式变量且不想逐个指定。
  • 需要立即执行回调(如初始化加载数据)。
  • 逻辑简单且依赖关系动态变化。

最佳实践与注意事项

1. 避免无限循环

在回调中修改被侦听的源数据可能导致无限循环:

// ❌ 错误示例
watch(count, (newVal) => {count.value = newVal * 2; // 触发再次侦听
});
2. 性能优化
  • 减少深度监听deep: true 对性能有影响,尽量明确侦听具体属性。
  • 合理使用 flushflush: 'post' 可确保回调在 DOM 更新后执行。
3. 异步操作处理
  • 使用 onCleanup 清理未完成的异步任务(如请求取消):

    watchEffect(async (onCleanup) => {const abortController = new AbortController();onCleanup(() => abortController.abort()); // 清理时取消请求const data = await fetch(url, {signal: abortController.signal});
    });
    

完整示例

示例 1:监听搜索关键词(防抖)
<script setup>
import { ref, watch } from 'vue';const searchKeyword = ref('');
let timer = null;watch(searchKeyword, (newKeyword) => {clearTimeout(timer);timer = setTimeout(() => {fetchResults(newKeyword); // 防抖处理}, 500);
});
</script>
示例 2:自动追踪窗口尺寸
<script setup>
import { watchEffect } from 'vue';const windowWidth = ref(window.innerWidth);watchEffect((onCleanup) => {const handleResize = () => {windowWidth.value = window.innerWidth;};window.addEventListener('resize', handleResize);onCleanup(() => {window.removeEventListener('resize', handleResize);});
});
</script>
API核心选择依据
watch需要明确侦听特定数据源,获取旧值,或需要延迟执行、深度监听时使用
watchEffect依赖多个动态数据源,需要立即执行,或依赖关系复杂时使用

相关文章:

Vue学习笔记集--watch

watch 在 Vue 3 的 Composition API 中&#xff0c;watch 和 watchEffect 是用于响应式侦听数据变化的核心 API。它们都能追踪依赖并执行副作用&#xff0c;但在使用方式和场景上有显著差异。以下是详细解析&#xff1a; watch 和 watchEffect 对比 特性watchwatchEffect依赖…...

基于springboot+vue的农产品电商平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

解决Dubbo3调用Springcloud接口报No provider available from registry RegistryDirectory

解决Dubbo调用Springcloud接口报No provider available from registry RegistryDirectory 问题发现问题解决 问题发现 在学习Dubbo过程中&#xff0c;Dubbo官网有一篇文章《微服务最佳实践&#xff0c;零改造实现 Spring Cloud & Apache Dubbo 互通》&#xff0c;跟着示例…...

使用 Avada 主题实现高级表单功能的技术指南

Avada 是 WordPress 上功能最强大的多功能主题之一&#xff0c;其内置的 Avada Builder 和灵活的选项使其非常适合创建高级表单功能。无论是联系表单、注册表单还是复杂的多步骤表单&#xff0c;Avada 都能通过与插件的集成和自定义设计满足多样化需求。本文将详细介绍如何利用…...

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…...

计算机底层基石:原码、反码、补码、移码深度剖析

在计算机的世界里&#xff0c;所有数据最终都以二进制的形式进行存储与运算。原码、反码、补码和移码作为二进制数据的重要编码方式&#xff0c;对计算机实现高效数据处理起着关键作用。接下来&#xff0c;我们将深入剖析这几种编码。​ 一、原码​ 1.1 定义​ 原码是最简单…...

第十四章:JSON和CSV格式详解及Python操作

在数据处理和开发工作中&#xff0c;JSON和CSV是两种非常常见的数据格式。它们各有特点&#xff0c;适用于不同的场景。本文将分别介绍这两种格式的产生原因、应用场景&#xff0c;并结合Python讲解如何操作这两种文件格式&#xff0c;最后用表格总结它们的常用操作及特性。资源…...

双磁条线跟踪控制

1问题 同学反馈小车跟随磁力线&#xff0c;双轮差速小车&#xff0c;左右侧各有2个磁条传感器和各1条磁条线&#xff0c;需要控制小车跟随磁条线轨迹。 2 方法 &#xff08;1&#xff09;普通小车可能没有速度反馈&#xff0c;则不考虑转弯半径&#xff0c;仅考虑一个控制关…...

【每日算法】Day 12-1:滑动窗口算法精讲——子串/子数组问题的优化利器(C++实现)

攻克子串问题的效率密码&#xff01;今日深入解析滑动窗口算法的核心思想与实战技巧&#xff0c;覆盖最小覆盖子串、最长无重复子串等高频场景&#xff0c;彻底掌握O(n)时间复杂度的窗口滑动艺术。 一、滑动窗口核心思想 滑动窗口&#xff08;Sliding Window&#xff09; 是一…...

树莓派超全系列文档--(7)RaspberryOS播放音频和视频

播放音频和视频 播放音频和视频VLC 媒体播放器vlc GUIvlc CLI使用 cvlc 在没有图形用户界面的情况下播放媒体 在 Raspberry Pi OS Lite 上播放音频和视频指定音频输出设备指定视频输出设备同时指定音频和视频输出设备提高数据流播放性能 文章来源&#xff1a; http://raspberr…...

chrome浏览器下载和Chrome浏览器的跨域设置

Chrome浏览器的跨域设置 下载chrome浏览器设置chrome跨域 下载chrome浏览器 点击官方下载&#xff0c;然后逐步安装即可 设置chrome跨域 1、然后在D盘创建个文件夹命名为ChromeDevSession。 2、右击chrome浏览器选择属性。 3、在目标编辑栏的最后加上&#xff1a;–disabl…...

Android14 SystemUI中添加第三方AIDL

由于特殊需求&#xff0c;需要在SystemUI中添加第三方AIDL&#xff0c;去做一些客制化的修改。现在记录一下AIDL添加的过程。 1.将AIDL文件拷贝到frameworks/base/packages/SystemUI/src/下&#xff0c;我要添加的AIDL文件是com/test/myctr/IDevicectr.aidl&#xff0c;添加后的…...

Appium中元素定位之一组元素定位API

应用场景 和定位一个元素相同&#xff0c;但如果想要批量的获取某个相同特征的元素&#xff0c;使用定位一组元素的方式更加方便 在 Appium 中定位一组元素的 API 与定位单个元素的 API 类似&#xff0c;但它们返回的是一个元素列表&#xff08;List<MobileElement>&am…...

【高并发内存池】第六弹---深入理解内存管理机制:ThreadCache、CentralCache与PageCache的回收奥秘

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】【项目详解】 目录 1、threadcache回收内存 2、centralcache回收内存 3、pagecache回收内存 1、threadcache回收内…...

累积分布策略思路

一种基于概率密度和累积分布函数的量化交易策略&#xff0c;主要应用于期货市场。该策略通过计算价格数据的概率密度和累积分布函数&#xff08;CDF&#xff09;&#xff0c;结合移动平均线和ATR&#xff08;平均真实范围&#xff09;等技术指标&#xff0c;实现多空交易的自动…...

【JavaScript】九、JS基础练习

文章目录 1、练习&#xff1a;对象数组的遍历2、练习&#xff1a;猜数字3、练习&#xff1a;生成随机颜色 1、练习&#xff1a;对象数组的遍历 需求&#xff1a;定义多个对象&#xff0c;存数组&#xff0c;遍历数据渲染生成表格 let students [{ name: 小明, age: 18, gend…...

RAG、大模型与智能体的关系

一句话总结&#xff1a; RAG&#xff08;中文为检索增强生成&#xff09; 检索技术 LLM 提示。 RAG、大模型与智能体的关系解析 1. 核心概念定义 RAG&#xff08;检索增强生成&#xff09; 是一种结合信息检索与生成式模型的框架&#xff0c;通过从外部知识库&#xff08;如…...

使用firewall-cmd配置SIP端口转发,实现双网卡互通,内外网方式

使用firewall-cmd配置SIP端口转发,实现双网卡,内外网方式 脚本内容 这里以内网IP: 192.168.2.88 这里以外网IP: 10.3.3.3 以下是一个用于启用和停用端口转发的Shell脚本&#xff1a; #!/bin/bash# 配置变量 ZONE"public" TARGET_IP"192.168.2.88" POR…...

Oracle数据库数据编程SQL<3.2 PL/SQL 匿名块中的DML操作、动态SQL、实际应用场景、使用技巧>

匿名块是学习和测试PL/SQL代码的强大工具&#xff0c;特别适合执行一次性任务或快速验证业务逻辑。 目录 一、匿名块中的DML操作 1. INSERT 示例 2. UPDATE 示例 3. DELETE 示例 二、匿名块中的动态SQL 1. EXECUTE IMMEDIATE 2. 动态游标--下篇文章会具体展开详细分享该…...

Spring AI Alibaba 实战:集成 OpenManus 实现智能体应用开发

引言 2024 年 9 月&#xff0c;阿里云正式开源 Spring AI Alibaba&#xff0c;为 Java 开发者提供了一套完整的 AI 应用开发框架&#xff0c;支持与通义系列大模型深度集成&#xff0c;并覆盖了从模型调用到云原生部署的全链路能力。而近期&#xff0c;中国团队发布的通用型 A…...

Linux中《进程状态--进程调度--进程切换》详细介绍

目录 进程状态Linux内核源代码怎么说运行&&阻塞&&挂起内核链表 进程状态查看Z(zombie)-僵尸进程僵尸进程危害孤儿进程 进程优先级进程切换Linux2.6内核进程O(1)调度队列 进程状态 Linux内核源代码怎么说 为了弄明白正在运⾏的进程是什么意思&#xff0c;我们…...

Element PlusAnt-design常问问题详解

Element UI Plus 高频面试问题解析(2025 版) 一、核心组件使用与原理 动态表头实现方案 • 场景:如何根据接口数据动态生成表头? • 技术方案: ◦ 使用 v-for 遍历表头数组生成 el-table-column ◦ 结合 render-header 属性实现复杂表头(如带提示的标题) ◦ 示例代码:通…...

【商城实战(96)】打造商城监控利器Prometheus与Grafana

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

Megatron-LM中的deepseek-v3实现

Megatron-LM&#xff1a;https://github.com/NVIDIA/Megatron-LM/tree/main 使用此仓库构建的著名的库也有很多&#xff0c;如: Colossal-AI, HuggingFace Accelerate, and NVIDIA NeMo Framework.Pai-Megatron-Patch工具是阿里人工智能平台PAI算法团队研发,ai-Megatron-Patch…...

SpringCloud如何整合DeepSeek

SpringCloud 整合 DeepSeek 的核心目标是通过微服务架构调用其分布式文件系统&#xff08;如 3FS&#xff09;或 API 服务。以下从技术选型、整合步骤和关键配置三个方面展开说明&#xff1a; 一、技术选型与架构分析 DeepSeek 服务类型 3FS 分布式文件系统&#xff1a;基于 RD…...

蓝桥杯备考:多米诺骨牌

这道题要求上下方格子和之差要最小&#xff0c;其实就是算每个上下格子的差求和的最小值 这道题其实是动态规划01背包问题 我们直接按步骤做吧 step1:定义状态表示f[i][j]表示从1到i个编号的差值里选出刚好j个数的最小操作次数 step2:推导状态转移方程 如图这就是我们的状态…...

wireshark开启对https密文抓包

HTTPS抓包解密指南 通常情况下&#xff0c;Wireshark只能抓取HTTP的明文包&#xff0c;对于HTTPS的报文需要特殊设置才能抓取。如果不进行设置&#xff0c;抓取到的都是TLS加密报文&#xff0c;这对调试工作造成了很大困难。 前言 提到HTTPS抓包&#xff0c;基本都绕不开SSL…...

AudioFlinger与AudioPoliceManager初始化流程

AF/APF启动流程 在启动AudioSeriver服务的过程中会对启动AF/APF。main_audioserver.cpp有如下代码&#xff1a; AudioFlinger::instantiate();AudioPolicyService::instantiate();AF初始化流程 1.AudioFlinger::instantiate() 1.1 AudioFlinger构造函数 void AudioFlinger:…...

网路传输层UDP/TCP

一、端口号 1.端口号 1.1 五元组 端口号(port)标识了一个主机上进行通信的不同的应用程序. 如图所示, 在一个机器上运行着许多进程, 每个进程使用的应用层协议都不一样, 比如FTP, SSH, SMTP, HTTP等. 当主机接收到一个报文中, 网络层一定封装了一个目的ip标识我这台主机, …...

Python大数据处理 基本的编程方法

目录 一、实验目的 二、实验要求 三、实验代码 四、实验结果 五、实验体会 一、实验目的 体会基本的python编程方法&#xff1b;学习python中的各类函数&#xff1b;了解python读取与写入文件的方法。 二、实验要求 输入2000年后的某年某月某日&#xff0c;判断这一天是…...