vue3中的watch侦听器

在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM ,或是根据异步操作的结果去修改另一处的状态。在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数。

 watch 函数可以侦听被 ref reactive 包裹的数据。

 watch 函数包含三个参数:

  1. 参数一: sources 被侦听的数据源;
  2. 参数二: cb callback 回调函数,函数中包含两个参数分别为新值和旧值;
  3. 参数三: options 侦听器的配置项, deep immediate 等参数。

1. watch 的常规写法 

<template>
  <div>姓名:<input type="text" v-model="name" /></div>
</template>

<script setup lang="ts">
import { ref, reactive, watch } from 'vue'
const name = ref<string>('张三')
watch(name, (newVal: any, oldVal: any) => {
  console.log(newVal, oldVal)
})
</script>

当输入框中值发生变化时,侦听器会监听并在控制台打印出来:

2. watch侦听多个数据

 watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref  (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组,侦听多个数据时:

<template>
  <div>姓名:<input type="text" v-model="name" /></div>
  <div>年龄:<input type="number" v-model="age" /></div>
</template>

<script setup lang="ts">
  import { ref, reactive, watch } from 'vue'
  const name = ref<string>('张三')
  const age = ref<number>(20)
  watch([name, age], (newVal: any, oldVal: any) => {
    console.log(newVal, oldVal)
  })
</script>

当被侦听的数据发生改变时:

3. watch侦听对象

(1)侦听使用 ref 的对象时,需要在侦听器的配置项中配置 deep true

<template>
  <div>年龄:<input type="text" v-model="obj.foo.bar.name" /></div>
</template>

<script setup lang="ts">
import { ref, reactive, watch } from 'vue'
const obj = ref({
  foo: {
    bar: {
      name: '张三'
    }
  }
})
watch(
  obj,
  (newVal: any, oldVal: any) => {
    console.log(newVal, oldVal)
  },
  {
    deep: true // 深度监听
  }
)
</script>

由于对象是引用类型,新值和旧值指向同一内存地址,所以值一样。 

(2)侦听使用 reactive 的对象时,不需要设置侦听器的配置项 deep

<template>
  <div>年龄:<input type="text" v-model="obj.foo.bar.name" /></div>
</template>

<script setup lang="ts">
import { ref, reactive, watch } from 'vue'
const obj = reactive({
  foo: {
    bar: {
      name: '张三'
    }
  }
})
watch(obj, (newVal: any, oldVal: any) => {
  console.log(newVal, oldVal)
})
</script>

 与上方 ref 一样,由于对象是引用类型,新值和旧值指向同一内存地址,所以值一样。

注意,不能直接侦听响应式对象的属性值,例如:

const obj = reactive({
  foo: {
    bar: {
      name: '张三'
    }
  }
})
watch(obj.foo.bar.name, (newVal: any, oldVal: any) => {
  console.log(newVal, oldVal)
})

会发生警告:

这是因为 watch source 接受的参数不符合要求,只能接受一个 getter effect  ref reactive 或者元素是这几个类型的数组。官方建议用一个返回该属性的 getter 函数:

const obj = reactive({
  foo: {
    bar: {
      name: '张三'
    }
  }
})

watch(
  () => obj.foo.bar.name,
  (newVal: any, oldVal: any) => {
    console.log(newVal, oldVal)
  }
)

当输入框值改变时:

4.watch的配置项 

  •  deep :布尔值,深度监听,默认 false
  •  immediate :布尔值,在创建侦听器时,立即执行一遍回调,默认 false
  •  plush :字符串,"pre":组件更新之前调用,"sync":同步执行,"post":组件更新之后执行,默认"pre"
  •  once :布尔值,回调只在源变化时触发一次,默认 false

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

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

相关文章

计算机的一些基础知识分享

windows操作系统中&#xff0c;用于查看当前文件下的目录是&#xff1f; 在Windows操作系统中&#xff0c;如果您想要查看当前文件夹下的目录&#xff0c;您可以使用命令提示符&#xff08;CMD&#xff09;或PowerShell。在这些环境中&#xff0c;可以使用以下命令&#xff1a;…

bmi088-linux驱动(I2C)

电气特性&#xff1a; 在正常工作时&#xff0c;gyro 工作电流为5mA&#xff0c;acc 工作电流为150uA。 SPI 时钟和数据电平范围 0 -3.6 结构框图如下&#xff1a; 硬件连接图如下&#xff1a; note&#xff1a; 1. 通过PS引脚选择通讯协议&#xff0c;上拉引脚则选择的是I2C…

HCIP的学习(16)

BGP的状态机 ​ OSPF的状态机是在描述整个协议的完整工作过程&#xff0c;而BGP的状态机仅描述的是对等体关系建立过程中的状态变化。-----因为BGP将邻居建立过程以及BGP路由收发过程完全隔离。 ​ IGP协议在启动后&#xff0c;需要通过network命令激活接口&#xff0c;从而使…

企业运维背后的故事:TASKCTL带你了解日常工作与技术演进

今天&#xff0c;作为一名经验丰富、从业多年经常与运维人员打交道的人&#xff0c;我想与大家聊聊运维的日常工作、部门协调以及未来发展&#xff0c;希望能为即将转行或正在从事运维工作的你&#xff0c;提供一些新的视角和启发。 运维的日常工作&#xff1a;挑战与乐趣并存 …

朱啸虎:AI应用明年肯定大爆发;第3款爆火AI游戏出现了;AI应用定价策略「不能说的秘密」;人类数据不够用了怎么办 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 换你来当爹&#xff1a;国内第3款爆火出圈的AI游戏应用&#xff0c;hhh 太搞笑了 周末的时候&#xff0c;社群里伙伴们开始玩一款「换你来当爹」的…

[Java EE] 多线程(九):JUC剩余部分与线程安全的集合类(多线程完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

群晖 Synology DSM7 过热关机解决方法

最近已经提示我过热关机过两次了&#xff0c;这两次一次是用虚拟机&#xff0c;一次是批量使用Synology Photos批量上传照片&#xff1a; 但是我没有对主机进行任何的位置移动以及硬件修改操作&#xff0c;散热环境没有发生变化。以前使用从来没有出现过这个问题&#xff0c;同…

MySQL Workbench创建数据库和景点评价表

创建一个数据库和一张用于存储景点评价的表。 一 创建数据库 1.双击选择 local instance MySQL80 2. 输入密码 连接成功 3. 创建 mydatabase数据库 4.确认创建 mydatabase数据库 5.选择finish 6.选择 Schemas查看刚才创建的mydatabast数据库 二、创建表 1.创建表 2.设置表信…

视觉SLAM十四讲:从理论到实践(Chapter3:三维空间刚体运动)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 目标 理解三维空间的刚体运动描述方式&#xff1a;旋转矩阵、变换矩阵、四元数和欧拉角。掌握Eigen库的矩阵、几何模块的使用方法。 3.1 旋转矩阵 3.1.1 点、向量和…

建立一物一码数字化营销体系,纳宝科技助力五丰黎红在调味品行业再创佳绩!

五丰黎红隶属于华润五丰集团&#xff0c;公司历史可溯源至1979年&#xff0c;前身是汉源花椒油厂&#xff0c;是一家拥有悠久历史的调味品品牌。一直以来&#xff0c;五丰黎红坚持调味品原料、研发、生产、加工一体化的全产业链经营模式&#xff0c;以“质量”为核心&#xff0…

快捷自由定时重启、注销、关机

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具&#xff0c;进入定时器编辑版块 2、左侧目录新建一个定时器 3、选择需要的周期&#xff0c;这里是每天0点&#xff0c;一次执行一条 4、添加具…

iOS copy的正确姿势

参考文章 知识准备&#xff08;理解堆栈&#xff09; 堆区&#xff1a; 程序员管理 若程序员不释放&#xff0c;由os释放不同于数据结构中的堆&#xff0c;堆区的结构类似于数据结构中的链表栈区&#xff1a; 由编译器来管理 存放函数参数值&#xff0c;局部变量的值等结构类似…

Visual Studio下载安装+详细使用学习

一、下载 官网&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 点击下载&#xff0c;一般用社区版免费的开发既可以。 百度网盘分享&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1W6-NY4ORsFzKTB3r77XFtw 提取码&…

Xmind Pro 2024 24安装教程

Xmind 应该是目前最好用的一款思维导图软件了。拥有优秀的用户体验&#xff0c;凭借简单易用&#xff0c;功能强大的特点&#xff0c;XMind在2013年被著名互联网媒体Lifehacker评选为全球最受欢迎的思维导图软件。 Xmind 具有如下优点 ①、用心打磨16年的思维导图软件 ②、评…

如何加密保护U盘?U盘加密方法盘点

U盘是目前最常用的移动存储设备&#xff0c;可以帮助我们存储大量数据。而为了保护数据安全&#xff0c;我们需要加密保护U盘。下面我们就来盘点一下U盘加密的方法。 BitLocker加密 BitLocker是Windows的一种磁盘保护工具&#xff0c;通过加密整个磁盘来保护数据&#xff0c;同…

均线金叉死叉及应用案例

5日均线和10日均线交叉 5日均线和10日均线交叉指的是5日和10日均线的相互交汇,根据5日均线运行方向的不同可以分为两种交叉。一是5日均线向上运行并交叉10日均线,二是5日均线向下运行并交叉10日均线,前面的交叉被称为金叉,后面的交叉被称为死叉。 技能解析: 5日均线和10日均…

数据可视化的艺术:使用Matplotlib和Seaborn揭示数据故事

引言 数据可视化是数据分析中的关键一环&#xff0c;它帮助我们理解数据模式、趋势和异常。在Python中&#xff0c;Matplotlib和Seaborn是两个流行的数据可视化库&#xff0c;它们提供了丰富的图表和图形选项&#xff0c;使数据的可视化变得简单而强大。 Matplotlib&#xff…

RS485和RS232区别

RS485和RS232接口在物理外观上的区别主要在于连接器的类型和接线方式上。这两种串行通讯接口虽然在功能上有所不同&#xff0c;但外观上也有一些显著的特点。 连接器类型&#xff1a; RS232 接口通常使用DB9或DB25类型的连接器。DB9是较为常见的&#xff0c;拥有9个针脚&#x…

Python笔记-Alchemy中改变表的模式(库schema)

现在是2024-01-10&#xff0c;发到互联网上应该是2024-05-13。查了下chatgpt&#xff0c;麻了&#xff0c;乱七八糟的。 最后还是靠stackoverflow解决的&#xff0c;目前&#xff0c;从解决问题的角度来看&#xff0c;这个还是牛逼点。 原文如下&#xff1a; python - How d…

用户登录认证和权限授权(SpringSecurity、JWT、session)

文章目录 前言一、登录认证1. 问题引入2. Session2.1 实现原理2.2 过滤器Filter2.3 上下文对象 3. JWT3.2 实现步骤3.3 拦截器 HandlerInterceptorAdapter3.4 上下文对象 4. Session VS JWT 二、权限授权1. 权限类型1.1 页面权限&#xff08;菜单项权限&#xff09;1.2 ACL模型…