vue3中watch的用法以及使用场景以及与watchEffect的使用对比

在 Vue 3 中,watchwatchEffect 是响应式系统的重要工具,帮助开发者监听数据变化并执行副作用操作。为了让你更好地理解 watchwatchEffect 的用法及其区别,这里将详细解释它们的使用方式、适用场景以及它们在基本类型和引用类型上的监听效果。


1. watch 的用法和适用场景

watch 用于监听特定的响应式数据或计算属性变化,并执行相应的回调。适合用于处理数据变化后的副作用,例如 API 请求、数据验证等。

基本用法

watch 需要传入两个主要参数:

  1. 监听目标:可以是 refreactive 数据,或是一个返回响应式数据的函数。
  2. 回调函数:在数据变化时触发,接收两个参数 newValueoldValue,分别表示新值和旧值。
import { ref, watch } from 'vue';const count = ref(0);watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);
});count.value = 5; // 输出:count changed from 0 to 5
使用场景
  • 监听数据并执行副作用:适合处理需要监听数据变化的场景,例如在用户输入时进行数据验证或 API 调用。

2. watch 监听 ref 定义的基本类型

ref 定义的基本类型数据如 numberstring 等,在数据变化时可以直接触发 watch 回调。

const message = ref('Hello');watch(message, (newMessage, oldMessage) => {console.log(`Message changed from "${oldMessage}" to "${newMessage}"`);
});message.value = 'Hello Vue 3!'; // 输出:Message changed from "Hello" to "Hello Vue 3!"

3. watch 监听 ref 定义的引用类型

ref 定义的引用类型数据(对象、数组)在监听时有两种情况:

  • 监听整体引用:修改整个对象时会触发回调并返回新旧值。
  • 监听内部属性:直接修改对象的属性不会触发回调,除非使用 { deep: true } 深度监听。
const user = ref({ name: 'Alice', age: 25 });watch(user, (newUser, oldUser) => {console.log(`User changed from`, oldUser, `to`, newUser);
}, { deep: true });// 修改整个对象会触发回调
user.value = { name: 'Bob', age: 30 }; // 输出:User changed from {name: 'Alice', age: 25} to {name: 'Bob', age: 30}// 修改属性时也会触发回调,因为深度监听了
user.value.age = 26; // 输出:User changed from {name: 'Bob', age: 25} to {name: 'Bob', age: 26}

4. watch 监听 reactive 对象

reactive 适用于创建深层响应式对象,例如嵌套对象或复杂结构。通过 watch 可以监听整个对象,也可以监听对象的某个属性变化。

监听整个 reactive 对象

设置 { deep: true } 可以递归监听 reactive 对象中的每一个属性,确保任何内部属性变化都能触发回调。

import { reactive, watch } from 'vue';const user = reactive({ name: 'Alice', age: 25, address: { city: 'NY', zip: '10001' } });watch(user, (newUser, oldUser) => {console.log(`User changed from`, oldUser, `to`, newUser);
}, { deep: true });// 修改嵌套属性
user.address.city = 'LA'; // 输出:User changed from {name: 'Alice', age: 25, address: {city: 'NY', zip: '10001'}} to {name: 'Alice', age: 25, address: {city: 'LA', zip: '10001'}}
监听 reactive 对象的单个属性

使用函数来监听特定属性的变化,避免递归监听整个对象,提升性能。

watch(() => user.age, (newAge, oldAge) => {console.log(`Age changed from ${oldAge} to ${newAge}`);
});user.age = 27; // 输出:Age changed from 25 to 27

5. 监听多个数据

watch 可以同时监听多个数据,传入一个包含多个目标的数组即可。这种方法适合处理多个响应式数据的变化。

const firstName = ref('John');
const lastName = ref('Doe');watch([firstName, lastName], ([newFirst, newLast], [oldFirst, oldLast]) => {console.log(`Name changed from ${oldFirst} ${oldLast} to ${newFirst} ${newLast}`);
});firstName.value = 'Jane'; // 输出:Name changed from John Doe to Jane Doe
lastName.value = 'Smith'; // 输出:Name changed from Jane Doe to Jane Smith

6. watchEffect 的用法

watchEffect 是 Vue 3 的一种自动依赖追踪方式,不需要手动指定依赖项。在回调函数中访问的所有响应式数据都会成为依赖,只要这些数据变化,回调函数会自动重新执行。

基本用法
import { ref, watchEffect } from 'vue';const count = ref(1);
const doubled = ref(2);watchEffect(() => {console.log(`Count is ${count.value}, Double is ${doubled.value}`);
});count.value = 2; // 输出:Count is 2, Double is 2
doubled.value = 4; // 输出:Count is 2, Double is 4
适用场景

watchEffect 适合自动响应简单的数据变化,尤其是需要自动执行的逻辑,省去了手动指定依赖项的步骤。常用于在挂载时执行的逻辑,或者需要自动收集依赖的副作用处理。

const firstName = ref('John');
const lastName = ref('Doe');watchEffect(() => {console.log(`Full name is ${firstName.value} ${lastName.value}`);
});firstName.value = 'Jane'; // 输出:Full name is Jane Doe
lastName.value = 'Smith'; // 输出:Full name is Jane Smith

7. watch vs watchEffect 的对比

特性watchwatchEffect
手动指定依赖需要手动指定自动收集依赖
使用新旧值对比可以获得新旧值,适合对比数据变化不提供新旧值,适合自动响应数据变化
常用场景适合监听特定数据,适用于精确控制数据变化时的副作用适合快速响应简单数据变化,如在组件挂载后执行逻辑
深度监听可以使用 { deep: true } 进行深度监听无法深度监听
性能和灵活性可精确控制依赖项更新,适合复杂逻辑简单灵活,适合自动响应依赖项变化

总结

  • watch:适合用于处理数据变化的副作用,尤其是异步请求、数据对比、深度监听复杂对象等场景。可以获取新旧值,灵活控制副作用逻辑。
  • watchEffect:适合自动依赖收集的简单场景,如在组件挂载时立即执行,且依赖项会自动更新,不需要手动指定依赖项。

通过灵活运用 watchwatchEffect,可以让 Vue 3 应用的数据响应更加高效,提升代码的可读性和维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456761.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细尝鲜flutter

flutter 161由于官方的汉化文档感觉还是有很多没有汉化的地方 ,所以自己打一遍的同时写下了以下笔记 社区生态 官方文档 所有的控件:Widget 目录 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 官方论坛的教程 Flutter Widget框架概述 - Flutter中文网…

微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件

要在微信小程序中关闭默认的 navigationBar,并使用自定义的 nav-bar 组件,你可以按照以下步骤操作: 1. 关闭默认的 navigationBar 在你的页面的配置文件 *.json 中设置 navigationBar 为 false。你需要在页面的 JSON 配置文件中添加以下代码…

JS 中 reduce()方法及使用

摘要: 开发中经常会遇到求合计的状况!比如和,积等!这次遇到的是求合计的和! reduce()方法是JavaScript中Array对象的一种高阶函数,用于对数组中的每个元素执行一个由您提供的reducer函数(回调函…

内置数据类型、变量名、字符串、数字及其运算、数字的处理、类型转换

内置数据类型 python中的内置数据类型包括:整数、浮点数、布尔类型(以大写字母开头)、字符串 变量名 命名变量要见名知意,确保变量名称具有描述性和意义,这样可以使得代码更容易维护,使用_可以使得变量名…

STM32-Modbus协议(一文通)

Modbus协议原理 RT-Thread官网开源modbus RT-Thread官方提供 FreeModbus开源。 野火有移植的例程。 QT经常用 libModbus库。 Modbus是什么? Modbus协议,从字面理解它包括Mod和Bus两部分,首先它是一种bus,即总线协议,和…

学习threejs,利用THREE.ExtrudeGeometry拉伸几何体实现svg的拉伸

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ExtrudeGeometry拉伸…

通过ssh端口反向通道建立并实现linux系统的xrdp以及web访问

Content 1 问题描述2 原因分析3 解决办法3.1 安装x11以及gnome桌面环境查看是否安装x11否则使用下面指令安装x11组件查看是否安装gnome否则使用下面指令安装gnome桌面环境 3.2 安装xrdp使用下面指令安装xrdp(如果安装了则跳过)启动xrdp服务 3.3 远程服务…

C2W4.LAB.Word_Embedding.Part1

理论课:C2W4.Word Embeddings with Neural Networks 文章目录 Word Embeddings First Steps: Data PreparationCleaning and tokenizationSliding window of wordsTransforming words into vectors for the training setMapping words to indices and indices to w…

七,Linux基础环境搭建(CentOS7)- 安装Scala和Spark

Linux基础环境搭建(CentOS7)- 安装Scala和Spark 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、Scala下载及安装 Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现…

合并数组的两种常用方法比较

在 JavaScript 中,合并数组的两种常用方法是使用扩展运算符 (...) 和使用 push 方法。 使用扩展运算符 this.items [...this.items, ...data.items]; 优点: 易于理解:使用扩展运算符的语法非常直观,表达了“将两个数组合并成一个…

24.redis高性能

Redis的单线程和高性能 Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外 提供键值存储服务的主要流程。 Redis 的多线程部分,比如持久化、异步删除、集群数据同步等&#xff…

合合信息亮相PRCV大会,探讨生成式AI时代的内容安全与系统构建加速

一、前言 在人工智能技术的飞速发展下,生成式AI已经成为推动社会进步的重要力量。然而,随着技术的不断进步,内容安全问题也日益凸显。如何确保在享受AI带来的便利的同时,保障信息的真实性和安全性,已经成为整个行业待解…

C#/.NET/.NET Core全面的自学入门指南

自学入门建议 确认学习目标:自学C#/.NET首先你需要大概了解该门语言和框架的发展、前景和基本特点,从自身实际情况和方向出发确认学习的必要性。 制定学习计划:制定一个详细的学习计划(比如每天学习一个C#/.NET知识点、小技能&am…

【web安全】缓慢的HTTP拒绝服务攻击详解

文章目录 前言一、攻击原理二、攻击类型三、攻击特点四、HTTP慢速攻击实战工具简介使用参数介绍五、修复建议前言 缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量http request攻击,直到服务器带宽被打满,造成…

微服务网关Zuul

一、Zuul简介 Zuul是Netflix开源的微服务网关,包含对请求的路由和过滤两个主要功能。 1)路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。 2)过滤功能:负责对请求的过程…

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法

在当今科技日新月异的时代,行人入侵检测技术作为安全防护的重要组成部分,正经历着前所未有的发展。入侵检测算法平台部署LiteAIServer作为这一领域的佼佼者,凭借其卓越的技术实力与广泛的应用价值,正逐步成为守护公共安全的新利器…

R5:天气预测-探索式数据分析

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、实验目的: 根据数据对 RainTomorrow 进行预测,熟悉探索式数据分析(EDA) 二、实验环境: 语言环境…

QT:MaintenanceTool 模块安装工具

QT的MaintenanceTool 工具对已安装的 Qt 进行卸载、修复等其他操作时提示At least one valid and enabled repository required for this action to succeed 解决方式:在设置中添加一个临时的仓库 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepositor…

LeetCode: 3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。   以下是棋盘的参考图。   如果这两个方格颜色相同,返回 true,否则返回 false。   坐标总是表示有效的棋盘方格。坐标的格式总是先…

【数据分享】全国各省份农业-瓜果类面积(1993-2018年)

数据介绍 一级标题指标名称指标全称单位指标解释农业瓜果类面积农业-瓜果类面积-瓜果类面积千公顷根据第三次全国农业普查结果,对2007年-2017年农业生产有关数据进行了修正。农业西瓜面积农业-瓜果类面积-西瓜面积千公顷根据第三次全国农业普查结果,对2…