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.mzph.cn/news/883219.shtml

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

相关文章

maven本地打jar包依赖

本地工程的pom文件中引入了mysql依赖,但是在maven库中没有拉下来,可以到mysql官网下载jar包,使用maven手动打包到本地仓库中: 官网地址:MySQL :: Download MySQL Connector/J (Archived Versions) 在jar包所在位置的路…

揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器

目录 🚀0.前言 🚈1.string 构造函数 🚝1.1string构造函数 🚝1.2string拷贝构造函数 🚈2.string类的使用 🚝2.1.查询元素个数或空间 返回字符串中有效字符的个数:size lenth 返回字符串目…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,现已广泛应用于农林生态,资源环境等方面,成为Science、Nature论文的…

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

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

混个1024勋章

一眨眼毕业工作已经一年了,偶然进了游戏公司成了一名初级游戏服务器开发。前两天总结的时候,本来以为自己这一年没学到多少东西,但是看看自己的博客其实也有在进步,虽然比不上博客里的众多大佬,但是回头看也算是自己的…

如果自建 ChatGPT,我会如何从 Model、Inference runtime 构建整个系统

ChatGPT 是一个基于 LLM 的对话系统。本文将介绍如何构建一个类似 ChatGPT 的系统,包括从模型、推理引擎到整体架构的构建过程。 系统概览 让我们关注最核心的对话部分。 如上图所示,web 负责与用户进行交互,server 接受用户的对话请求&…

算法的学习笔记—数组中只出现一次的数字(牛客JZ56)

😀前言 在数组中寻找只出现一次的两个数字是一道经典的问题,通常可以通过位运算来有效解决。本文将详细介绍这一问题的解法,深入解析其背后的思路。 🏠个人主页:尘觉主页 文章目录 🥰数组中只出现一次的数字…

【移动应用开发】界面设计(二)实现水果列表页面

续上一篇博客 【移动应用开发】界面设计(一)实现登录页面-CSDN博客 目录 一、采用ViewBinding实现一个RecyclerView 1.1 在app/build.gradle中添加recyclerview依赖,并打开viewBinding (1)在app/build.gradle中添加…

Servlet(三)-------Cookie和session

一.Cookie和Session Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件,由服务器发送给浏览器。当用户再次访问同一网站时,浏览器会把Cookie信息发送回服务器。例如,网站可以利用Cookie记住用…

金融工程--pine-script 入门

背景 脚本基本组成 策略实现 实现马丁格尔策略 初始化变量:定义初始资本、初始头寸大小、止损百分比、止盈百分比以及当前资本和当前头寸大小等变量。 更新头寸:创建一个函数来更新头寸大小、止损价格和止盈价格。在马丁格尔策略中,每次亏…

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…

micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite

micro-app 官方文档为 https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite 子应用 无需任何修改,直接启动子应用即可。 主应用 1. 安装微前端框架 microApp npm i micro-zoe/micro-app --save2. 导入并启用微前端框架 microApp src/main.ts …

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台,求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才,求职者则通过上传简历寻找合适的工作。在这种复杂的场景中,我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

leetcode-75-颜色分类

题解(方案二): 1、初始化变量n0,代表数组nums中0的个数; 2、初始化变量n1,代表数组nums中0和1的个数; 3、遍历数组nums,首先将每个元素赋值为2,然后对该元素进行判断统…

【开源项目】经典开源项目数字孪生工地——开源工程及源码

飞渡科技数字孪生工地管理平台,以物联网、移动互联网技术为基础,充分应用人工智能等信息技术,通过AI赋能建筑行业,对住建项目内人员、车辆、安全、设备、材料等进行智能化管理,实现工地现场生产作业协调、智能处理和科…

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前,先介绍一个概念设计模式&#xff…

stm32入门教程--ADC模拟-数字转换器

ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转你换位内存中存储的数字变量,建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC,1us转换时间 输入电压范围:0-3.3V转换结果范围…

Pyramidal Flow使用指南:快手、北大、北邮,开源可免费商用视频生成模型,快速上手教程

什么是 Pyramidal Flow? Pyramidal Flow 是由快手科技、北京大学和北京邮电大学联合推出的开源视频生成模型,它是完全开源的,发布在 MIT 许可证下,允许商业使用、修改和再分发。该模型能够通过文本描述生成最高10秒、分辨率为128…

Embedding 模型和Model 批量推理和多卡部署

批量推理 多卡部署 使用huggingface 【AI大模型】Transformers大模型库(七):单机多卡推理之device_map_transformers多卡推理-CSDN博客 首先用 CUDA_VISIBLE_DEVICES1,2,3 python 或者os.environ["CUDA_VISIBLE_DEVICES"] &q…

风力发电场的“守护神”

摘要:作为清洁能源之一,风力发电场近几年装机容量快速增长。8月17日,国家能源局发布1-7月份全国电力工业统计数据。截至7月底,全国累计发电装机容量约27.4亿千瓦,同比增长11.5%。其中,太阳能发电装机容量约…