【Vue3】watch监听使用【超详细】

文章目录

  • 情况一:监听ref定义的基本类型数据
  • 情况二:监听ref定义的对象类型数据
  • 情况三:监听reactive定义的对象类型数据
  • 情况四:监听ref或reactive定义的对象类型数据中某个属性
  • 情况五:监听上述多个数据


#watch使用结构
watch(被监视的数据,监视的回调,配置对象(deep,immediate等...))let xxx = ref("1111") 或者 reactive({a:1,b:2})
watch(xxx,(newVal,oldVal)=>{},{ 
deep:true,immediate:true
})

vue3watch只能监听的以下四种数据:

  1. 一个getter函数(一个能返回值的函数)
  2. ref定义的值
  3. reactive定义的值
  4. 包含以上内容的数组`

情况一:监听ref定义的基本类型数据

watch监听ref简单的基本类型数据

代码展示

<template><div class="itemStyle"><div>姓名: <input type="text" v-model="name"></div></div>
</template><script setup lang="ts" name="item">import {ref,reactive,toRefs,toRef,watch} from "vue"let name = ref("小张")watch(name,(newVal,oldVal)=>{console.log("新值:",newVal);console.log("旧值:",oldVal);})
</script>

解除监听案例

<template><div class="itemStyle"><div>当前数量: <span>{{num}}</span></div><div><button @click="handleAdd">添加数量</button></div></div>
</template><script setup lang="ts" name="item">import {ref,reactive,toRefs,toRef,watch} from "vue"let num = ref(1)const handleAdd = ()=>{num.value++}let stopWatch = watch(num,(newVal,oldVal)=>{console.log("我监听了");if(newVal>5){stopWatch()}})
</script>

情况二:监听ref定义的对象类型数据

watch监听ref简单的对象地址值,若想监视对象内部属性的变化,需要手动开启深度监视

代码展示

<template><div class="itemStyle"><div>姓名: <input type="text" v-model="data.name"></div><div>年轻: <input type="text" v-model="data.age"></div><div>打篮球: <input type="text" v-model="data.hobby"></div><div><button type="button" @click="handleChangeData">修改数据</button></div></div>
</template><script setup lang="ts" name="item">import {ref,reactive,toRefs,toRef,watch} from "vue"let data = ref({name:"小张",age:18,hobby:"打篮球"})const handleChangeData = ()=>{data.value = {name:"小红",age:20,hobby:"打乒乓球"}}watch(data,(newVal,oldVal)=>{console.log("新值:",newVal);console.log("旧值:",oldVal);},{deep:true,//开启深度监听})</script>

情况三:监听reactive定义的对象类型数据

特别注意:如果监听reactive定的数据,默认开始深度监听的,不能关闭

代码展示

<template><div class="itemStyle"><div>姓名: <input type="text" v-model="data.name"></div><div>年轻: <input type="text" v-model="data.age"></div><div>打篮球: <input type="text" v-model="data.hobby"></div><div>其他: <input type="text" v-model="data.other.c.d"></div><div><button type="button" @click="handleChangeOtherData">修改其他</button></div><div><button type="button" @click="handleChangeData">修改数据</button></div></div>
</template><script setup lang="ts" name="item">import {ref,reactive,toRefs,toRef,watch} from "vue"let data = reactive({name:"小张",age:18,hobby:"打篮球",other:{a:"1111",b:"2222",c:{d:"1111",e:"2222",}}})const handleChangeData = ()=>{Object.assign(data,{name:"小红",age:20,hobby:"打乒乓球"})}const handleChangeOtherData = ()=>{data.other.c.d="更多内容"}watch(data,(newVal,oldVal)=>{console.log("新值:",newVal);console.log("旧值:",oldVal);})</script>

情况四:监听ref或reactive定义的对象类型数据中某个属性

特别注意:

  1. 若该属性值不是【对象类型】,需要写成函数形式
  2. 若该属性值是依然【对象类型】,可直接写,也可以写成函数,建议写成函数

结论:监视的要是对象里的属性,那么最好写函数式
注意点:若是对象监视的是地址值,需要关注对象内部,需要手动开启深度监视。

代码展示

<template><div class="itemStyle"><div>姓名: <input type="text" v-model="data.name"></div><div>年轻: <input type="text" v-model="data.age"></div><div>打篮球: <input type="text" v-model="data.hobby"></div><div>其他: <input type="text" v-model="data.other.c.d"></div><div><button type="button" @click="handleChangeOtherData">修改其他</button></div></div>
</template><script setup lang="ts" name="item">import {ref,reactive,toRefs,toRef,watch} from "vue"let data = reactive({name:"小张",age:18,hobby:"打篮球",other:{a:"1111",b:"2222",c:{d:"1111",e:"2222",}}})const handleChangeOtherData = ()=>{data.other.c.d="更多内容"}//监视响应式对象中的某个属性,且该属性是基本类型的,要写成函数watch(()=>data.name,(newVal,oldVal)=>{console.log("新值:",newVal);console.log("旧值:",oldVal);})//监视响应式对象中的某个属性,且该属性是对象类型的,可以直接写,也能写函数,更推荐写函数watch(()=>data.other.c,(newVal,oldVal)=>{console.log("新值:",newVal);console.log("旧值:",oldVal);},{deep:true})</script>

情况五:监听上述多个数据

代码展示

<template><div class="itemStyle"><div>姓名: <input type="text" v-model="data.name"></div><div>年轻: <input type="text" v-model="data.age"></div><div>打篮球: <input type="text" v-model="data.hobby"></div><div>其他: <input type="text" v-model="data.other.c.d"></div><div><button type="button" @click="handleChangeOtherData">修改其他</button></div></div>
</template><script setup lang="ts" name="item">import {ref,reactive,toRefs,toRef,watch} from "vue"let data = reactive({name:"小张",age:18,hobby:"打篮球",other:{a:"1111",b:"2222",c:{d:"1111",e:"2222",}}})const handleChangeOtherData = ()=>{data.other.c.d="更多内容"}//监视,情况五:监视上述的多个数据watch([data.other.c,()=>data.name,()=>data.age,()=>data.hobby],(newVal,oldVal)=>{console.log("新值:",newVal);console.log("旧值:",oldVal);},{deep:true})</script>

踩坑不易,还希望各位大佬支持一下 \textcolor{gray}{踩坑不易,还希望各位大佬支持一下} 踩坑不易,还希望各位大佬支持一下

📃 个人主页: \textcolor{green}{个人主页:} 个人主页: 沉默小管

📃 个人网站: \textcolor{green}{个人网站:} 个人网站: 沉默小管

📃 个人导航网站: \textcolor{green}{个人导航网站:} 个人导航网站: 沉默小管导航网

📃 我的开源项目: \textcolor{green}{我的开源项目:} 我的开源项目: vueCms.cn

🔥 技术交流 Q Q 群: 837051545 \textcolor{green}{技术交流QQ群:837051545} 技术交流QQ群:837051545

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

如果有不懂可以留言,我看到了应该会回复
如有错误,请多多指教

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

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

相关文章

[Android]使用 androidx.navigation:navigation 指南

使用 androidx.navigation:navigation 指南 最外层项目 build.gradle.kts 添加 plugins {id("com.android.application") version "8.1.1" apply falseid("org.jetbrains.kotlin.android") version "1.9.0" apply false//id ("…

GitHub介绍,GitHub如何订阅充值?

一、GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持git 作为唯一的版本库格式进行托管&#xff0c;故名Github。 GitHub于2008年4月10日正式上线&#xff0c;除了git代码仓库托管及基本的Web管理界面以外&#xff0c;还提供了订阅、讨论组、…

Windows系统引导重建,Windows引导损坏修复

Windows系统引导重建 引导是一个非常**「脆弱」的东西&#xff0c;对系统、分区**的操作都有可能导致其出现问题。 比如分区操作不当、不小心格式化某个分区、误删看不懂的文件&#xff0c;这与你用什么软件操作无关。 而引导只要出现问题&#xff0c;你的电脑就无法进入系统…

go语言通过TCP协议实现聊天室样例

目录 1、服务端&#xff1a; 2、客户端&#xff1a; 3、实现效果 1、服务端&#xff1a; package mainimport ("fmt""net""sync" )type ChatServer struct {clients map[string]net.ConnclientsMux sync.Mutex }func NewChatServer() *Ch…

使用 Python 发送带附件的电子邮件教程

在本教程中&#xff0c;我们将学习如何使用 Python 中的 smtplib 和 email 库发送带有附件的电子邮件。我们将通过一个简单的示例来演示如何编写代码来完成这个任务。 1. 准备工作 在开始之前&#xff0c;确保你已经安装了 Python&#xff0c;并且你有一个有效的电子邮件地址…

功能测试_分类_用例_方法

总结 测试分类 按阶段分类 是否查看源代码分类 是否运行分类 是否自动化 其他分类 软件质量模型 开发模型-瀑布模型 测试过程模型 v w 测试用例八大要素 用例编号 用例标题 …

【delphi 】常用资源网站

在Delphi的日常开发中&#xff0c;经常会用到第三方资源&#xff0c;本文收集的是开源的资源&#xff0c;建议收藏&#xff0c;以备不时之需&#xff01; 目录 一、通用资源 1. JCL 2. JVCL 3. Alcinoe (mirror at GH) 4. Fundamentals Code Library 5. Spring4D 6. The…

装饰器模式【结构型模式C++】

1.概述 装饰器模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08;Concre…

Cmake Learn

目录 1 常用命令 &#xff08;1&#xff09;configure_file &#xff08;2&#xff09;.cmake文件 &#xff08;3&#xff09; install &#xff08;4&#xff09;include_directories &#xff08;5&#xff09; add_subdirectory &#xff08;6&#xff09; find_libr…

FPGA秋招-笔记整理(3)无符号数、有符号数

参考&#xff1a;Verilog学习笔记——有符号数的乘法和加法 一、无符号数、有符号数 将输入输出全部定义为有符号数 &#xff08;1&#xff09;无符号数的读取按照原码进行&#xff0c;有符号数的读取应该按照补码读取&#xff0c;计算规则为去掉符号位后取反、加1在计算数值…

中国人工智能奠基人张钹院士:走进“无人区” 探索人工智能之路

4月23日&#xff0c;中国人工智能奠基人、清华大学计算机系教授、中国科学院院士张钹在“人文清华”讲坛作专题分享。在2小时的直播中&#xff0c;张钹以《走进“无人区” 探索人工智能之路》为主题&#xff0c;回顾人工智能的发展历程&#xff0c;为大家解读ChatGPT的意义&…

掺硼金刚石电极(BDD电极)电化学特性优异 全球市场将持续扩大

掺硼金刚石电极&#xff08;BDD电极&#xff09;电化学特性优异 全球市场将持续扩大 掺硼金刚石电极&#xff0c;简称BDD电极&#xff0c;是以掺硼金刚石&#xff08;BDD&#xff09;为材料制造而成的电极&#xff0c;即以金属或非金属材料为衬底&#xff0c;采用化学气相沉积法…

十大经典排序算法之选择排序。

​ 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是通过重复从未排序的部分选择最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其放到已排序部分的末尾&#xff0c;直到整个列表都排序完成&#xff0c;也就是说…

基于Springboot的web后端开发三层架构上手实操

引言 我们拿到了xml文件 我们要将将xml文件中的数据加载并解析 完成数据的处理 并且返回给前端页面(result格式) 1.将xml文件放在resources目录下 xml是我们需要解析的文件 查看xml文件 2.在springboot中引入dom4j依赖 解析xml需要在springboot中引入dom4j依赖 这边我们…

Thread类的基本用法

1.线程创建 这里介绍线程创建常用的五种方法 1.继承Thread&#xff0c;重写run class MyThread extends Thread{public void run(){//这里写的代码就是线程要完成的任务while (true){System.out.println("hello thread");try {Thread.sleep(1000);//线程会休眠一秒…

二维码门楼牌管理应用平台建设:取保候审人员管理的新模式

文章目录 前言一、取保候审人员管理的新挑战二、二维码门楼牌管理应用平台的引入三、平台的功能与应用四、优势与挑战五、结论 前言 随着科技的不断进步&#xff0c;二维码门楼牌管理应用平台已成为城市管理的创新手段。特别是在取保候审人员管理领域&#xff0c;这一技术的应…

电视盒子哪款好?实体店主盘点畅销电视盒子排名

电视盒子功能丰富&#xff0c;是升级电视机最具性价比的方案。我本人做实体数码店多年来&#xff0c;电视盒子是店内销量最好的产品之一&#xff0c;最近很多网友在讨论电视盒子哪款好&#xff0c;我整理了店内销量最好的电视盒子排名&#xff0c;想买电视盒子可以看看下面这几…

海外盲盒App开发:探索全球惊喜,开启无限可能

一、前言 随着全球化的深入发展&#xff0c;人们对于不同文化、不同地域的商品充满了好奇与向往。盲盒文化&#xff0c;作为一种充满神秘与惊喜的消费方式&#xff0c;正逐渐在全球范围内受到热烈追捧。为了满足海外用户对于盲盒的需求&#xff0c;我们团队精心策划并开发了一…

读写锁ReentrantReadWriteLockStampLock详解

现实中有这样一种场景&#xff1a;对共享资源有读和写的操作&#xff0c;且写操作没有读操作那么频繁&#xff08;读多写少&#xff09;。在没有写操作的时候&#xff0c;多个线程同时读一个资源没有任何问题&#xff0c;所以应该允许多个线程同时读取共享资源&#xff08;读读…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者&#xff0c;我长期关注特殊群体的生活现状与科技助力下的改善举措。今天&#xff0c;我要讲述的是盲人朋友在独立出行&#xff0c;尤其是过马路时面临的挑战&#xff0c;以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能&#xff0c;显著提…