快速打通 Vue 3(三):Vue3 中的 watch 监听器与新特性

很激动进入了 Vue 3 的学习,作为一个已经上线了三年多的框架,很多项目都开始使用 Vue 3 来编写了
这一组文章主要聚焦于 Vue 3 的新技术和新特性
如果想要学习基础的 Vue 语法可以看我专栏中的其他博客
Vue(一):Vue 入门与 Vue 指令
Vue(二):计算属性与 watch 监听器
Vue(三):Vue 生命周期与工程化开发
一篇文章快速通关 Vuex(适合小白学习)
Vue 框架前导:详解 Ajax
快速打通 Vue 3(一):基本介绍与组合式 API
快速打通 Vue 3(二):响应式对象基础
上一篇 Vue3 博客:快速打通 Vue 3(二):响应式对象基础
后续还会继续更新,期待大家的关注!

05. watch 监听

5.1 概述

watch 的作用和 vue2 中的作用相同,只不过在组合式 API 的情况下要写成函数的形式。

需要注意的是 Vue3 中的 watch 属性只能监视以下的 四种数据

  1. ref 定义的数据(实际上是其中的 value
  2. reactive 定义的数据
  3. 函数返回的一个值(getter 函数):主要是监视某一属性的时候使用
  4. 一个包含上述内容的数组

5.2 监视 ref 定义的基本数据类型

要点概览:

  1. 函数的返回值为 stopWatch
  2. 函数式写法

语法:

const stopWatch = watch(监视的参数, (newValue, oldValue)=> {
	console.log(newValue, oldValue);
	if (newValue >= 10) {
		stopWatch();
	}
})

注意我们 watch 中放的是响应式的数据,不需要加 .value ,通过我们之前提到的插件可以自动帮助我们添加。

返回的是一个 stopWatch 函数,我们可以通过这个函数来停止监视。

实践一下,监听一个 sum 打印出新的值,当其等于 10 的时候停止监视

<template>
  <div class="person">
    <h2>{{sum}}</h2>
  </div>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue';
  let sum = ref(10);
  const stopWatch = watch(sum, (value)=> {
    console.log(value);
    if (value = 10) {
      stopWatch();
    }   
  })
</script>

5.3 监视 ref 定义的对象类型的数据

要点概览

  1. 监视的是对象的地址值
  2. 开启深度监视
  3. 对监视对象的理解

监视对象的时候我们监视的是这个对象的地址

<template>
  <div class="person">
    <h2>{{person.name}}</h2>
    <h2>{{person.age}}</h2>
    <button @click="changePerson"></button>
  </div>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue';
  let person = ref({
    name: 'Tom',
    age: 18
  });
  const stopWatch = watch(person, (newValue, oldValue)=> {
    console.log(newValue, oldValue);
  })
  function changePerson () {
    person.value = {name: '李四', age: 19};
  }
</script>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当对象修改的时候是可以检测到的,只是修改属性是无效的,但如果我们想要监听其中的属性,需要手动开启深度监视,向 watch 再传入一个配置对象来打开 深度监视

  const stopWatch = watch(person, (newValue, oldValue)=> {
    console.log(newValue, oldValue);
  }, {
      deep: true, immediate: true
  })

deep 是开启深度监视,immediate 是一进入界面立刻执行监视。

我们添加一个函数来修改 name,在把对象也打印出来:

  const stopWatch = watch(person, (newValue, oldValue)=> {
    console.log(newValue, oldValue);
  }, {deep: true, immediate: true})
  function changeName () {
    person.value.name = '李四';
  }

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一看,为什么 newValueoldValue 是相同的呢?

这需要我们对于监听对象有更深入的了解,当对象修改的时候我们先去寻找 newValue 发现姓名被修改了,打印出整个对象出来,但是当我们再回头去寻找 oldValue 地址还是原来那个地址,所以打印出来的是修改后的值。

这是框架的一点小问题,无法通过技术手段避免,但我们开发的时候一般只用到 newValue 就能实现几乎所有的需求了,不需要去太关心这个,略作了解即可。

5.4 监视 reactive 定义的对象类型

要点概览:

  1. 自动开启深度监视

和上面相同,也是针对对象的监视,但需要注意的是对于 reactice 的监视,是默认开启深度监视的,而且我们无法关闭这个自动监视

对于这个设定其实很好理解,reactive 对象修改会失去响应式特性,我们不监视属性还能监视什么呢?🐶

<script setup lang="ts">
import { reactive, watch } from 'vue';
  let person = reactive({
    name: 'Tom',
    age: 18
  });
  const stopWatch = watch(person, (newValue, oldValue)=> {
    console.log(newValue, oldValue);
  }, {deep: true, immediate: true})
  function changePerson () {
    person = {name: '李四', age: 19};
  }
  function changeName () {
    person.name = '李四';
  }
</script>

写出代码,和上面没什么区别,注意一下 .value 和默认深度监视即可

5.5 监视响应式对象的某个属性

要点概览

  1. 属性值不是对象类型要写成函数形式
  2. 是对象类型也建议写成函数形式(一把梭)

我们也可以去监视响应式对象的某个属性,不需要将其转换为响应式数据(比如通过 toRef

所谓通过函数形式其实就是将需要监听的数据作为函数去传入,举个例子

<template>
  <div class="person">
    <h2>{{person.name}}</h2>
    <h2>{{person.age}}</h2>
    <button @click="changeName">changeName</button>
    <button @click="changeAge">changeAge</button>
  </div>
</template>

<script setup lang="ts">
import { reactive, watch } from 'vue';
  let person = reactive({
    name: 'Tom',
    age: 18
  });
  const stopWatch = watch(()=>person.name, (newValue, oldValue)=> {
    console.log(newValue, oldValue);
  })
  function changeAge () {
    person.age += 1
  }
  function changeName () {
    person.name = '李四';
  }
</script>

在上面的例子中,我们只监视 name 属性,Age 属性的改变不会被监视

const stopWatch = watch(()=>person.name, (newValue, oldValue)=> {
    console.log(newValue, oldValue);
})

具体来看应该很清晰是如何传入特定的属性的

下面我们来看对象属性

let person = reactive({
    name: 'Tom',
    age: 18,
    friend: {
    	name: 'Jack'
    }
});
const stopWatch = watch(()=>person.name, (newValue, oldValue)=> {
    console.log(newValue, oldValue);
  })
function changeFriend() {
	person.friend = {name: '王五'}
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是可以被监视到的

需要注意的是,对象属性其实不需要添加函数形式,正常写也是可以的,但为了格式的统一和记忆的方便,以后统一写成函数的形式,了解一下有不需要函数的写法即可

5.6 监视多种数据

要点概览:

  1. 掌握写法即可

因为非常好理解,这里直接给出写法,就是通过箭头函数返回多个值即可。

  watch([()=>person.name,person.car],(newValue,oldValue)=>{
    console.log('person.car变化了',newValue,oldValue)
  })

5.7 watchEffect

要点概览:

  1. watchEffect 的语法
  2. watch 的区别

在使用 watch 的时候,我们要手动的传入要监视的数据,但是在 watchEffect 中,会 自动识别 被监视的内容。

语法:

  const stopWatch = watchEffect(()=> {
    console.log(person.name);
  })

总结:

  • watchEffect适合于那些希望在函数内部自动追踪其依赖项的场景,当函数内部的响应式数据发生变化时,函数自动执行。
  • watch更适用于需要更精确地控制监视特定数据变化并执行相应操作的情况,可以监视特定数据或表达式,并在满足特定条件时执行回调函数。
  • 总的来说,watchEffectwatch都是用于侦听数据变化的方法,但watchEffect更自动化且适用于较为简单的场景,而watch提供了更多的控制能力,适用于需要更精确处理数据变化的情况。

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

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

相关文章

原生JS做别踩白块游戏

思路 创建初始一个按钮并为他添加点击监听开始创建随机方块&#xff0c;并样式_box.offsetTop speed px结合setInterval使得方块不断下移创建和删除方块的原则&#xff1a;box.offsetTop>0&#xff08;可视区上部没有方块了&#xff09;时候需要创建一行方块&#xff0c;…

【HarmonyOS开发】通过媒体查询,实现一次开发,多端部署

媒体查询&#xff08;Media Queries&#xff09;是一种在CSS中使用的技术&#xff0c;用于根据设备的特性和属性&#xff08;如屏幕宽度、设备类型等&#xff09;来应用不同的样式规则。通过媒体查询&#xff0c;可以根据不同的设备或屏幕尺寸为用户提供优化的布局和样式。 1、…

three.js: gltf模型设置发光描边

效果&#xff1a; 代码 &#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div style"padding: 10px…

C++Qt6 哈夫曼编码求解 数据结构课程设计 | JorbanS

一、 问题描述 在进行程序设计时&#xff0c;通常给每一个字符标记一个单独的代码来表示一组字符&#xff0c;即编码。在进行二进制编码时&#xff0c;假设所有的代码都等长&#xff0c;那么表示 n 个不同的字符需要 位&#xff0c;称为等长编码。如果每个字符的使用频率相等&…

【算法系列 | 11】深入解析查找算法之—插值查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第11讲&#xff0c;讲…

阿里云服务器端口PPTP 1723放行教程

阿里云服务器安装PPTP VPN需要先开通1723端口&#xff0c;阿里云服务器端口是在安全组中操作的&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说明阿里云服务器安全组开放PPTP VPN专用1723端口教程&#xff1a; 阿里云服务器放行1723端口教程 PPTP是点对点隧道协议&#…

八大算法排序@选择排序(C语言版本)

目录 选择排序概念算法思想示例步骤1步骤2步骤...n最后一步 代码实现时间复杂度空间复杂度特性总结 选择排序 概念 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。基本思想是在未排序的序列中找到最小&#xff08;或最大&#xff09;元素&#xf…

数据库之索引

1. 索引的定义 索引是一个排序的列表&#xff0c;包含索引字段的值和其对应的行记录的数据所在的物理地址。 索引的作用&#xff1a; 加快表的查询速度&#xff0c;还可以对字段排序。 2. 索引的工作方式 有了索引后&#xff0c;要根据条件查询某行数据时&#xff0c;需要先…

IPA打包过程中的Invalid Bundle Structure错误如果解决

在iOS应用程序开发中&#xff0c;打包和发布应用程序是一个必要的步骤。有的时候在打包的过程中可能会遇到一些错误&#xff0c;其中一个比较常见的错误是"Invalid Bundle Structure"。这个错误通常意味着应用程序的文件结构不正确&#xff0c;而导致的无法成功打包应…

自动循环采集全站文章

如果文章页面中&#xff0c;有上一篇、下一篇文章&#xff0c;推荐文章等链接&#xff0c;我们可以利用这个特点&#xff0c;仅配置采集一个文章页面&#xff0c;即可采集整个网站或某个分类下的所有文章&#xff0c;实现自动循环采集全站数据&#xff0c;非常方便简单。 使用…

天然药物,到2028年市场规模将达到 3082亿美元

天然药物&#xff0c;也称为草药或传统药物&#xff0c;是指将植物、矿物和动物产品等天然物质用于药用目的。近年来&#xff0c;人们对天然药物作为传统药物的替代品越来越感兴趣&#xff0c;这导致了天然药物市场的增长。全球天然药物市场&#xff1a; 全球天然药物市场预计从…

2024腾讯云服务器租用价格表_优惠活动大全_最新报价

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

安科瑞余压监控系统在住宅小区的应用方案——安科瑞 顾烊宇

【摘要】&#xff1a;本文分析了火灾发生时人员伤亡的主要原因——烟雾&#xff0c;并针对该原因提供切实可靠的系统应用解决方案&#xff0c;并通过具体案例&#xff0c;从设计依据、产品选型、系统组网、现场安装等方式介绍余压监控系统&#xff0c;希望可以在火灾发生时较大…

BMS均衡技术

一、电池的不一致性&#xff1f; 每个电池都有自己的“个性”&#xff0c;要说均衡&#xff0c;得先从电池谈起。即使是同一厂家同一批次生产的电池&#xff0c;也都有自己的生命周期、自己的“个性”——每个电池的容量不可能完全一致。例如以下的两个原因都会造成电池不一致…

树与二叉树笔记整理

摘自小红书 ## 树与二叉树 ## 排序总结

【数据库】MySQL数据库存储引擎、数据库管理和数据库账号管理

【数据库】MySQL数据库存储引擎、数据库管理和数据库账号管理 一 常用的数据引擎1.1 InnoDB存储引擎1.2 MyISAM存储引擎1.3 Memory存储引擎1.4 ARCHIVE存储引擎 二 数据库管理2.1 元数据库概念与分类2.2 相关操作命令 三 数据表的管理四 数据库账户管理 一 常用的数据引擎 数据…

清风数学建模笔记-多分类-fisher线性判别分析

内容&#xff1a;Fisher线性判别分析 一.介绍&#xff1a; 1.给定的训练姐&#xff0c;设法投影到一维的直线上&#xff0c;使得同类样例的投影点尽可能接近和密集&#xff0c;异类投影点尽可能远离。 2.如何同类尽可能接近&#xff1a;方差越小 3.如何异类尽可能远离&#…

阿里云2核2G3M服务器能放几个网站?有限制吗?

阿里云2核2g3m服务器可以放几个网站&#xff1f;12个网站&#xff0c;阿里云服务器网的2核2G服务器上安装了12个网站&#xff0c;甚至还可以更多&#xff0c;具体放几个网站取决于网站的访客数量&#xff0c;像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

获取网页信息

每次copy & paste总是很麻烦&#xff0c;现在有点问题&#xff0c;先记录下来。 需求&#xff1a;获取url 里Feature list&#xff0c;并输出表格形式 可以用Convert curl commands to code&#xff1a;得到get请求的header&#xff0c;cookie等 import requests import…

Jmeter二次开发实操问题汇总(JDK问题,jar包问题)

前提 之前写过一篇文章&#xff1a;https://qa-lsq.blog.csdn.net/article/details/119782694 只是简单尝试了一下生成一个随机手机号码。 但是如果在工作中一个实际场景要用的二次开发&#xff0c;可能会遇到一些问题。 比如这样一个场景&#xff1a; Mobile或者前端调用部分…