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包所在位置的路…

06_Linux 文件权限与管理命令

系列文章导航:01_Linux基础操作CentOS7学习笔记-CSDN博客 文章目录 Linux 文件权限与管理命令一、Linux 文件类型二、用户/组管理用户相关文件用户信息解析用户密码管理:shadow 阴影文件解析用户管理命令1. **useradd**:添加新用户2. **user…

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

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

JavaScript 中如何实现函数缓存

在JavaScript中,函数缓存是一种优化技术,它通过将函数的计算结果存储起来,以避免在后续调用中重复计算相同的值。这特别适用于那些计算成本高昂且输入参数有限的函数。以下是实现函数缓存的几种常见方法: 1. 使用对象作为缓存 这…

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

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

【机器学习】13. 决策树

决策树的构造 策略:从上往下学习通过recursive divide-and-conquer process(递归分治过程) 首先选择最好的变量作为根节点,给每一个可能的变量值创造分支。然后将样本放进子集之中,从每个分支的节点拓展一个。最后&a…

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

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

为什么需要MQ?MQ具有哪些作用?你用过哪些MQ产品?请结合过往的项目经验谈谈具体是怎么用的?

需要使用MQ的主要原因包括以下几个方面‌: ‌异步处理‌:在分布式系统中,使用MQ可以实现异步处理,提高系统的响应速度和吞吐量。例如,在用户注册时,传统的做法是串行或并行处理发送邮件和短信,这…

混个1024勋章

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

Ruby CGI Cookie

Ruby CGI Cookie 在Web开发中,Cookie是一种常用的技术,用于在用户浏览器和服务器之间存储和传递信息。Ruby作为一种流行的编程语言,提供了CGI(Common Gateway Interface)库来处理Cookie。本文将详细介绍如何在Ruby中使用CGI库来创建、读取、修改和删除Cookie。 Cookie的…

如何检查前端项目和 Node 项目中未被使用的依赖包

前言 在日常的开发工作中,随着项目的不断迭代和功能的逐渐增加,我们难免会安装许多依赖包。时间一长,项目中可能会存在一些不再使用的依赖包。这些未被使用的依赖包不仅会增加项目的体积,还可能带来安全隐患。 本文将介绍如何检查…

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

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

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

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

JavaScript 第27章:构建工具与自动化

在现代JavaScript开发中,构建工具、代码转换工具、代码质量和代码格式化工具对于提高开发效率、保持代码整洁以及确保代码质量有着至关重要的作用。下面将分别介绍Webpack、Babel、ESLint和Prettier的配置与使用,并给出一些示例。 1. 构建工具&#xff…

Vue组件学习 | 一、 Router组件

各位程序员1024节日快乐~ Vue Router 是 Vue.js 的官方路由管理器,它和 Vue.js 的核心深度集成,让构建单页面应用(SPA)变得简单。以下是 Vue Router 的基本用法 Vue Router 基本用法 安装 Vue Router 首先,你需要安…

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

续上一篇博客 【移动应用开发】界面设计(一)实现登录页面-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记住用…

java 17天 TreeSet以及Collections

SortedSet TreeSet Collections 所有单值集合 1 SortedSet 特点:有序 唯一 实现类:TreeSet 利用TreeSet特有的对数据进行升序,再放到ArryList进行for下标倒序打印,或者利用自身的pollLast()取出最后元…

金融工程--pine-script 入门

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

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

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