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

news2024/11/26 14:32:46

日期: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

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

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

相关文章

期末复习GGG-----查找子串

郭的 char *search( char *s, char *t ){int i0;while(s[i]){int j0;if(s[i]t[0]){while(s[ij]t[j]&&t[j]){j;}if(t[j]\0)return si;}i;}return NULL; } AI的 #include <stdio.h> #include <string.h> #define MAXS 30char *search(char *s, char *t);in…

Matlab使用Simulink仿真实现AM和BPSK信号的解调

前言 本篇实现了基于AM和BPSK调制的通信系统&#xff0c;采用Bernoulli Binary Generator生成随机二元序列&#xff0c;码元速率为0.5秒/个。AM调制使用Sine Wave模块生成载波&#xff0c;频率40Hz&#xff0c;相位π/2。BPSK调制通过Switch模块切换相位0和π的载波。信号传输…

红利之外的A股底仓选择:A50

内容提要 华泰证券指出&#xff0c;当前指数层面下行风险不大&#xff0c;市场再入震荡期下&#xff0c;可关注三条配置线索&#xff1a;1&#xff09;A50为代表的产业巨头&#xff1b;2&#xff09;以家电/食饮/物流/出版为代表的稳健消费龙头&#xff0c;3&#xff09;消费电…

使用 Iceberg、Tabular 和 MinIO 构建现代数据架构

现代数据环境需要一种新型的基础架构&#xff0c;即无缝集成结构化和非结构化数据、轻松扩展并支持高效的 AI/ML 工作负载的基础架构。这就是现代数据湖的用武之地&#xff0c;它为您的所有数据需求提供了一个中心枢纽。然而&#xff0c;构建和管理有效的数据湖可能很复杂。 这…

【离散化 二维差分】850. 矩形面积 II

本文涉及知识点 离散化 二维差分 LeetCode850. 矩形面积 II 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中&#xff08;x1&#xff0c;y1&#xff09;是矩形 i 左下角的坐标&#xff0c; (xi1, yi1) 是该矩形 左下角 的坐标…

物联网协议基础知识

协议允许节点以结构化的方式在它们之间进行交互。由于物联网设备的需求和用例在过去几年中迅速发展&#xff0c;协议也随之发展。总而言之&#xff0c;主要有两类协议&#xff1a;网络协议和数据协议。此分类来自广泛应用于 IT 通信网络的 OSI&#xff08;开放系统互连&#xf…

深入探讨JavaScript的执行机制

预编译 首先下面这段代码的执行是一个怎样的结果呢&#xff1f; showName(); console.log(MyName);var MyName 小陈同学function showName() {console.log(函数showName被执行); }在这段代码中我们声明了一个变量MyName和一个函数showName&#xff0c;调用函数&#xff0c;打…

TWM论文阅读笔记

这是ICLR2023的一篇world model论文&#xff0c;用transformer来做世界模型的sequence prediction。文章贡献是transformer-based world model&#xff08;不同于以往的如transdreamer的world model&#xff0c;本文的transformer-based world model在inference 的时候可以丢掉…

手机usb共享网络电脑没反应的方法

适用于win10电脑&#xff0c;安卓手机上可以 开启usb网络共享选择&#xff0c;如果选择后一直跳&#xff0c;让重复选择usb选项的话&#xff0c;就开启 开发者模式&#xff0c;进到 开发者模式 里设置 默认usb 共享网络 选项 &#xff0c;就不会一直跳让你选。 1.先用数据线 连…

一款.NET开源、功能强大、跨平台的绘图库 - OxyPlot

前言 今天大姚给大家分享一款.NET开源&#xff08;MIT License&#xff09;、免费、跨平台、功能强大的绘图库&#xff0c;支持多平台使用&#xff08;包括&#xff1a;WPF、UWP、WinForm、Silverlight、Xamarin.iOS、Xamarin.Android、Xamarin.Forms 和 Xamarin.Mac等&#x…

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors 块设备名称为&#xff1a; /dev/sda 设备的大小为&#xff1a;107.4 GB 107374182400 bytes &#xff1a; 107374182400/1024/1024/1024100G &#xff08;1&#xff09;块设备名称为&#xff1a;/dev/sd…

DS18B20温度传感器完整使用介绍(配合51单片机)

DS18B20是一款由Maxim Integrated&#xff08;原Dallas Semiconductor&#xff09;生产的数字温度传感器&#xff0c;以其高精度、低功耗、灵活的接口方式和易于使用的特性&#xff0c;在各种温度监测应用中被广泛采用。 以下是DS18B20的详细介绍&#xff1a; 基本特性 数字输…

【CSS in Depth2精译】1.1 层叠

CSS 本质上就是声明规则&#xff0c;并让这些特定的规则在各种情况下生效。一个类添加到某个元素上&#xff0c;则应用这个类包含的这一些样式&#xff1b;元素 X 是元素 Y 的一个子节点&#xff0c;则应用另一些样式。浏览器于是根据这些规则&#xff0c;判定所有样式生效的具…

数据结构-十大排序算法集合(四万字精讲集合)

前言 1&#xff0c;数据结构排序篇章是一个大的工程&#xff0c;这里是一个总结篇章&#xff0c;配备动图和过程详解&#xff0c;从难到易逐步解析。 2&#xff0c;这里我们详细分析几个具备教学意义和实际使用意义的排序&#xff1a; 冒泡排序&#xff0c;选择排序&#xff0c…

解决安全规模问题:MinIO 企业对象存储密钥管理服务器

在强大可靠的存储解决方案领域&#xff0c;MinIO 作为持久层脱颖而出&#xff0c;为组织提供安全、持久和可扩展的存储选项。MinIO 通常负责处理关键任务数据&#xff0c;在确保高可用性方面发挥着至关重要的作用&#xff0c;有时甚至在全球范围内。存储数据的性质&#xff0c;…

vue音乐播放条

先看效果 再看代码 <template><div class"footer-player z-30 flex items-center p-2"><div v-if"isShow" class"h-12 w-60 overflow-hidden"><div :style"activeStyle" class"open-detail-control-wrap&…

《现代通信原理与技术》数字调制与解调(MSK调制)实验报告

摘 要&#xff1a; 本实验旨在研究数字调制中的最小频移键控&#xff08;MSK&#xff09;调制技术&#xff0c;并使用MATLAB软件对其进行模拟和实现。首先&#xff0c;我们介绍了MSK调制的原理和特点&#xff0c;以及其在数字通信系统中的应用。然后&#xff0c;我们使用MATLAB…

分布式光纤测温DTS使用的单模光纤与多模光纤有何区别?

分布式光纤测温DTS中使用的单模光纤和多模光纤之间存在着本质区别。单模光纤是一种在光纤通信中应用广泛的光纤类型&#xff0c;几乎所有的光纤入户和主干线通信都采用单模光纤。从通信的角度来看&#xff0c;单模光纤就好比一条单行道的高速铁路&#xff0c;而多模光纤则类似于…

微型操作系统内核源码详解系列五(2):cm3下栈的初始化

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…

Flutter 实现软鼠标

文章目录 前言一、如何实现&#xff1f;1、记录鼠标偏移2、MouseRegion获取偏移3、Transform移动图标 二、完整代码三、使用示例总结 前言 flutter在嵌入式系统中运行时&#xff0c;有可能遇到drm鼠标无法使用的情况&#xff0c;但鼠标事件却可以正常接收&#xff0c;此时如果…