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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维别卷系列 - 云原生监控平台 之 03.prometheus label 实践

文章目录 [toc]label 简介自定义标签relabel_configsregexrelabel_action metric_relabel_configs两者的区别 实践 label 简介 label 对于 Prometheus 来说&#xff0c;属于数据处理的方式&#xff0c;Prometheus 是通过指定的 label 来查询数据 Prometheus 的 target 中实例&…

unity 2d像素游戏抖动问题

有的时候移动的时候会抖动&#xff0c; 刚体的这里改成插值&#xff0c;平滑移动解决

验证集的划分方法:确保机器学习模型泛化能力的关键

验证集的划分方法&#xff1a;确保机器学习模型泛化能力的关键 目录 一、验证集的作用 二、验证集的划分方法 三、注意事项 四、总结 在机器学习任务中&#xff0c;我们不仅要关注模型在训练数据上的表现&#xff0c;更重要的是模型在未见数据上的泛化能力。为了评估和提高…

Kafka基础架构详解

Kafka基础架构 Kafka概述 1. Producer&#xff08;生产者&#xff09;&#xff1a; 生产者是向 Kafka broker 发送消息的客户端。它负责将消息发布到指定的主题&#xff08;Topic&#xff09;&#xff0c;并可以选择将消息发送到特定的分区&#xff08;Partition&#xff09…

高中数学:平面向量-加减运算

一、向量的加法运算 三角形法则&#xff08;推荐&#xff09; 两个或多个向量收尾相连的加法运算&#xff0c;用三角形法则 简便算法 首尾相连的多个向量&#xff0c;去掉中间点&#xff0c;就是最终的和。 也可以用三角形法则证明 向量加法交换律 向量加法结合律 平行四…

打造销售爆款利器!淘宝商品评论电商API接口全方位解析

无论是实体店还是电商平台&#xff0c;通过有效的销售推广手段&#xff0c;提升产品销量都是商家追求的目标。而淘宝商品评论电商API接口就是一种非常有效的工具&#xff0c;它能够帮助商家获取、分析并利用商品评论信息&#xff0c;为销售策略提供有力支持。联讯数据将全面解析…

Flutter 依据JSON数据自动生成实体类

json自动化生成工具 点击这里可以跳转 页面是这样的 然后在左边输入你的json数据&#xff0c;它会自动生成对应的实体类 生成的实体类是如下&#xff1a; import package:json_annotation/json_annotation.dart; part merch_region.g.dart;JsonSerializable()class MerchReg…

华为设备使能Auto-Config功能

Auto-Config is working. Before configuring the device, stop Auto-Config. If you perform configurations when Auto-Config is running, the DHCP, routing, DNS, and VTY configurations will be lost. Do you want to stop Auto-Config? [y/n] 背景信息 此任务的应用场…

AI图像生成-基本步骤

模型板块 1、新建采样器&#xff1a;新建节点-》采样器-》K采样器 2、拖动模型节点后放开&#xff0c;选择checkpoint加载器&#xff08;简易&#xff09;&#xff0c;模型新建成功 提示词板块 1、拖动正面条件节点后放开&#xff0c;选择CLIP文本编码器&#xff0c;模型新建…

Vue 封装axios

【一】准备工作 &#xff08;1&#xff09;安装必要插件 安装Axios&#xff0c;这是必要的。默认最新版 npm install axios -S 或 cnpm install axios -S安装elementui-plus&#xff0c;用于提示信息 npm install element-plus --save # 或 cnpm install element-plus --s…

智慧公厕,提升公共厕所管理效率的信息化变革

现代社会中&#xff0c;公共厕所的管理成为一个不可忽视的问题。随着城市化进程的加快&#xff0c;人们对公厕的需求日益增加&#xff0c;但公厕的管理却面临诸多困难。为了解决这一问题&#xff0c;智慧公厕应运而生&#xff0c;通过信息化的变革&#xff0c;提高公厕的管理效…

GeoServer /geoserver/wms RCE漏洞复现(CVE-2022-24816)

0x01 产品简介 GeoServer是一款开源的地理数据服务器软件,主要用于发布、共享和处理各种地理空间数据。它支持众多的地图和空间数据标准,能够使各种设备通过网络来浏览和使用这些地理信息数据。 0x02 漏洞概述 GeoServer /geoserver/wms 接口处存在远程代码执行漏洞,未经…