【vue3|第9期】Vue3中watch监视的深度解读

日期:2024年6月10日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006

说在最前面:本文 vue3 的示例代码,在没有另外声名的情况下,均采用 <script setup> 组合式代码风格,风格统一,避免混乱,请各位新老食客放心食用哈 ^ _ ^


文章目录

  • 一、前言
  • 二、什么是 watch?
    • 1、watch 基本语法
    • 2、取消 watch 监视
  • 三、Watch 监视的工作原理
  • 四、Watch 中可选配置对象
  • 五、Vue 3中 Watch可监视的数据类型
    • 1、ref定义的数据
    • 2、reactive定义的数据
    • 3、函数返回的值(`getter`函数)
    • 4、包含上述内容的数组
  • 六、watch 的适用场景
  • 七、总结


在这里插入图片描述


一、前言

Vue3 中,watch 是一个重要的特性,它允许我们监视数据的变化,并在数据发生变化时执行特定的操作。本文将深入探讨 Vue3 中的watch特性,包括如何设置监视,可以监视哪些数据,以及适用场景。

二、什么是 watch?

简单来说,watch 允许我们密切观察特定数据的变化,并在数据发生变化时执行相应的操作或逻辑。

1、watch 基本语法

watch(source, callback, options)

其中,

  • source 表示要监视的数据,可以是一个响应式数据对象、一个计算属性、一个方法的返回值或包含上述内容的数组;
  • callback 表示当数据发生变化时要执行的回调函数;
  • options 是一个可选的配置对象,用于指定一些选项,如 immediatedeepflush 等。

2、取消 watch 监视

在某些情况下,我们可能需要停止对某个watch的监视。Vue 3提供了unwatch函数来取消监视。

const unwatch = watch(source, callback, options)

// 当需要停止监视时调用 unwatch()
unwatch();

三、Watch 监视的工作原理

Vue3 中,watch 监视的工作原理基于 Vue 的响应式系统。当我们使用 watch 来监视某个数据计算属性时,Vue 会追踪这个数据或计算属性的依赖关系,并在它们发生变化时触发相应的回调函数。这个过程包括两个主要步骤:

  • 依赖收集
    当我们在组件中声明一个 watch 时,Vue 会分析该 watch 所依赖的数据或计算属性,并将它们标记为需要被监视的依赖项。
  • 依赖通知
    当被监视的依赖项发生变化时,Vue 会触发相应的 watch 回调函数,并将变化后的新值旧值作为参数传递给该函数。这样,我们就可以在回调函数中执行自定义的逻辑来处理这些变化。

四、Watch 中可选配置对象

immediatedeepflushVue3watch 函数的可选配置选项,用于控制监视的行为。

  • immediate:如果设置为 true,则在组件挂载时立即执行回调函数,而不是在数据变化时才执行。这对于在组件挂载时需要进行一些初始化操作非常有用。
  • deep:如果设置为 true,则会递归地监视对象的所有属性,包括嵌套对象的属性。如果对象的属性发生变化,回调函数将被触发。如果不设置 deep,则只会监视对象的顶层属性。
  • flush:用于控制回调函数的执行时机。它可以设置为 'pre'(在组件更新之前执行)、'post'(在组件更新之后执行)或 'sync'(在数据变化时立即执行,与 immediate 类似,但会在组件更新之前执行)。

以下示例展示了如何使用这些选项:

import { reactive, watch } from 'vue';

const state = reactive({
  count: 0,
  obj: {
    name: 'John',
    age: 30
  }
});

// 立即执行回调函数
watch(state, (newValue, oldValue) => {
  console.log('State has changed:', newValue);
}, { immediate: true });

// 深度监视对象的所有属性
watch(state.obj, (newValue, oldValue) => {
  console.log('Object has changed:', newValue);
}, { deep: true });

// 在组件更新之前执行回调函数
watch(state, (newValue, oldValue) => {
  console.log('State has changed:', newValue);
}, { flush: 'pre' });

在上述示例中,我们使用 watch 函数监视了 state 对象和 state.obj 对象的变化。通过设置 immediate: true,我们在组件挂载时立即执行了回调函数。通过设置 deep: true,我们递归地监视了 state.obj 对象的所有属性。通过设置 flush: 'pre',我们在组件更新之前执行了回调函数。

五、Vue 3中 Watch可监视的数据类型

Vue3 中的 watch 可以监视多种数据类型的变化,包括:

1、ref定义的数据

refVue3中用于定义响应式数据的一种方式。我们可以使用 watch 来监视 ref 定义的基本类型数据对象类型数据的变化。

<template>
  <div>{{count}}</div>
</template>

<script setup>
import { ref, watch } from 'vue';

// ref定义的数据
const count = ref(0);

// 监视 count 
watch(count, (newValue, oldValue) => {
  console.log(`count 从 ${oldValue} 变为 ${newValue}`);
});
</script>

2、reactive定义的数据

reactiveVue3 中用于定义响应式对象的一种方式。与 ref 类似,我们也可以使用 watch 来监视reactive 定义的对象的变化。

<template>  
  <input v-model="person.name" placeholder="Name">  
  <input v-model.number="person.age" type="number" placeholder="Age">  
  <p>Person: {{ person.name }}, {{ person.age }} years old</p>  
</template>  
  
<script setup>  
import { reactive, watch } from 'vue';  
  
const person = reactive({  
  name: 'Commas',  
  age: 18,  
});  
  
watch(person, (newValue, oldValue) => {  
  // 注意:当监视 reactive 对象时,newValue 和 oldValue 是相同的,因为它们指向同一个对象  
  // 如果需要深度比较,你可能需要使用 deep 选项(但 Vue 3 默认是浅比较的)  
  // 或者你可以考虑使用 toRaw 和一个 deep clone 库  
  console.log('Person has changed:', newValue);  
}, { deep: true }); // 注意:对于 reactive 对象,通常需要设置 deep: true  
</script>

3、函数返回的值(getter函数)

Vue3 中,我们还可以使用 watch 来监视一个函数的返回值的变化。这通常用于监视计算属性的变化。

<template>  
  <input v-model="firstName" placeholder="First name">  
  <input v-model="lastName" placeholder="Last name">  
</template>  

<script setup>  
import { ref, watch } from 'vue';  
  
const firstName = ref('Commas');  
const lastName = ref('KM');  
  
watch(  
  () => firstName.value + ' ' + lastName.value, // 使用 getter 函数  
  (newValue, oldValue) => {  
    console.log('Full name has changed:', newValue);  
  }  
);  
</script>

4、包含上述内容的数组

watch 还支持同时监视多个数据的变化。我们可以将一个包含多个要监视的数据的数组作为 watch 的第一个参数,然后在回调函数中处理这些数据的变化。

<template>  
  <input v-model="firstName" placeholder="First name">  
  <input v-model="lastName" placeholder="Last name">  
</template>  
  
<script setup>  
import { ref, watch } from 'vue';  
  
const firstName = ref('Commas');  
const lastName = ref('KM');  
  
watch([firstName, lastName], (newValues, oldValues) => {  
  console.log('Names have changed:', newValues, oldValues);  
});  
</script>

六、watch 的适用场景

Vue3 中的 watch 具有广泛的应用场景,包括但不限于以下几种情况:

  • 监听表单的变化:在表单应用中,我们经常需要监听表单字段的变化来执行一些操作,如验证输入、更新数据等。这时,我们可以使用 watch 来监视表单字段的变化,并在变化时执行相应的逻辑。
  • 监听路由参数的变化:在 Vue Router 中,我们可以使用 watch 来监视路由参数的变化,以便在路由变化时执行一些操作,如加载数据、更新UI等。
  • 监听Vuex中的数据变化VuexVue 的一个状态管理模式和库。在 Vuex 中,我们可以使用 watch 来监视状态的变化,并在变化时触发相应的操作,如更新 UI、发送请求等。
  • 监听复杂计算属性的变化:当我们的组件中包含复杂的计算属性时,我们可以使用watch来监视这些计算属性的变化,以便在它们变化时执行一些操作,如重新渲染视图、更新其他数据等。

七、总结

Vue3 中的 watch 是一个功能强大的工具,它允许我们监视 Vue 实例中的数据变化并执行相应的操作。通过深入理解 watch 的工作原理、可监视的数据类型以及适用场景,我们可以更好地利用这一功能来构建高效、可维护的Vue应用。


参考文章:

  • Vue.js

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/139623853

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

element-plus的Tour 漫游式引导怎么去绑定Cascader 级联选择器

首先官方例子是用的button 官方.$el这个log出来是&#xff1a; 知道是以元素为准就拿对应的元素就行 级联选择器.$el是这样的&#xff1a; 你可以移入这个元素部分去看看是哪个要用的&#xff08;好像火狐直接放上去就可以看到元素表示&#xff0c;谷歌要双击或者右键选择去看…

英语恶补ing

ing的词组都有停下来做某事的感觉了。 second hand是形容词了。 wouldnt buy这里的would是情态动词&#xff0c;也是助动词 助动词不能单独使用&#xff0c;要搭配实义动词&#xff0c;这样才能构成谓语 情态动词&#xff08;modals&#xff09;在英语中有多种作用&#xff…

Fedora40的#!bash #!/bin/bash #!/bin/env bash #!/usr/bin/bash #!/usr/bin/env bash

bash脚本开头可写成 #!/bin/bash , #!/bin/env bash , #!/usr/bin/bash , #!/usr/bin/env bash #!/bin/bash , #!/usr/bin/bash#!/bin/env bash , #!/usr/bin/env bash Fedora40Workstation版的 /bin 是 /usr/bin 的软链接, /sbin 是 /usr/sbin 的软链接, rootfedora:~# ll …

java8实战1(让方法参数具备行为能力)

客户需求是查出颜色为green的苹果 客户需求变成查出颜色为red的苹果 假设现在客户需求又变了,找出黄色的呢?你想查什么颜色直接做为参数输入 让调用者输入颜色参数 问题是现在客户想把重量做为条件,来筛选苹果集合 这就为难了,客户需求随时会变 观察以上例子,发现有个共同…

Android Studio无法连接夜神模拟器的解决方案

一、AS检测不到夜神模拟器 1、问题描述 在按照教程【如何安装和使用Android夜神模拟器】进入夜神的bin目录&#xff0c;输入连接命令回车后&#xff0c;终端显示的already connected to 127.0.0.1:62001&#xff0c;但是AS的Running Devices并没有显示夜神模拟器。 2、解决方…

新能源汽车的能源动脉:中国星坤汽车电缆在新能源汽车电气化中的应用!

随着新能源汽车行业的蓬勃发展&#xff0c;汽车电缆组件作为汽车电气系统的核心组成部分&#xff0c;其重要性日益凸显。中国星坤汽车电缆组件以其卓越的性能和创新技术&#xff0c;为汽车的电能传输、信号传递和控制提供了坚实的保障。本文将深入解析星坤汽车电缆组件的特性、…

Objective-C 学习笔记 | KVO(key-value obsereving)

Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09; Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09;使用 KVOKVO 的工作原理 Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09; KVO 是指当指定的对象…

GPT-4系列模型,在文档理解中的多维度评测

著名云数据平台Snowflake的研究人员发布了一篇论文&#xff0c;主要对OpenAI的GPT-4系列模型进行了研究&#xff0c;查看其文本生成、图像理解、文档摘要等能力。 在DocVQA、InfographicsVQA、SlideVQA和DUDE数据集上对GPT-4、GPT-4 V、GPT-4 Turbo V OCR等进行了多维度测试。…

【交易策略】#22-24 残差资金流强度因子

【交易策略】#22-24 残差资金流强度因子

太速科技-FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡

FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡 一、板卡概述 该板卡为了考虑兼容1.8V电平IO&#xff0c;适配Virtex7&#xff0c;Kintex Ultrascale&#xff0c;Virtex ultrasacle FPGA而特制&#xff0c;如果要兼容原来的3.3V 也可以修改硬件参数。板卡支持1路…

我的python-web基础(Flask前后端不分类)

1.HTML HTML是超文本标记语言 &#xff08; 英文 &#xff1a; HyperText Markup Language &#xff0c; HTML &#xff09;&#xff0c;它不是编程语言&#xff0c;而是一种标记语言 HTML标记标签通常被称为HTML标签&#xff0c;它的特点如下&#xff1a; HTML标签是由尖括…

【电脑小白】装机从认识电脑部件开始

前言 在 B 站上刷到了一个很牛逼的电脑装机视频&#xff0c;很适合电脑小白学习&#xff0c;故用文本记录下。 推荐对组装台式电脑有兴趣的小伙伴都去看看这个视频&#xff1a; 原视频链接&#xff1a;【装机教程】全网最好的装机教程&#xff0c;没有之一_哔哩哔哩_bilibil…

font-spider按需生成字体文件

font-spider可以全局安装,也可以单个项目内安装,使用npm run xxxx的形式 npm i font-spider "dev": "font-spider ./*.html" <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&…

RAG与Langchain简介

RAG与Langchain简介 什么是RAGRAG解决的问题RAG工作流程RAG调优策略LangChain简介 什么是RAG 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;主要是通过从外部给大模型补充一些知识&#xff0c;相当于给模型外挂了一个知识库&#xff0c;让…

软件测试-第2章-软件测试策略

目录 1.1软件测试的生命周期 1&#xff0e;计划阶段 2&#xff0e;设计阶段 3&#xff0e;开发阶段 4&#xff0e;执行阶段 5&#xff0e;评估阶段 1.2测试步骤 ​编辑2.2.1 单元测试 2.2.2 集成测试 2.2.3 确认测试 2.2.4 系统测试 1.3静态方法与动态方法 1.4…

RERCS系统开发实战案例-Part05 FPM Application的Feeder Class搜索组件的实施

1、通过事务码 SE24对Feeder Class实施 1&#xff09;接口页签的简单说明&#xff1a; ① IF_FPM_GUIBB&#xff1a;通用UI构建块&#xff0c;整个UIBB模块的基础接口&#xff1b; ② IF_FPM_GUIBB_SEARCH&#xff1a;通用搜索UI构建块&#xff0c;搜索组件UIBB的基础接口&…

PCL 拟合二维椭圆(迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 一般情况,我们会用椭圆拟合二维点,用椭球拟合三维点。在n维中,这些对象被称为超椭球体,由二次方程隐式定义 超椭球的中心是n1向量C,nn矩阵S是正定的,n1向量X是超椭球上的任意点。矩阵S可以用特征分解,S = R…

前端学习笔记100篇之002:Webpack简明教程(持续完善中)

文章目录 1. **安装和初始化**2. **创建和配置入口文件**3. **编写和配置Webpack配置文件**4. **打包和运行项目** Webpack是一个静态模块打包工具&#xff0c;适用于前端项目构建和模块化开发。Webpack通过从入口文件构建依赖图&#xff0c;然后打包相关的模块&#xff0c;最终…

数据库管理-第205期 换个角度看23ai(20240617)

数据库管理205期 2024-06-17 数据库管理-第205期 换个角度看23ai&#xff08;20240617&#xff09;1 规范应用开发2 融合总结 数据库管理-第205期 换个角度看23ai&#xff08;20240617&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE Pro…

【Linux】进程间通信2——命名管道

1. 命名管道(FIFO) 1.1. 基本概念 简单&#xff0c;给匿名管道起个名字就变成了命名管道 那么如何给 匿名管道 起名字呢&#xff1f; 结合文件系统&#xff0c;给匿名管道这个纯纯的内存文件分配 inode&#xff0c;将文件名与之构建联系&#xff0c;关键点在于不给它分配 D…