【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.mfbz.cn/a/591716.html

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

相关文章

【Java从入门到精通】Java 流(Stream)、文件(File)和IO

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式&#xff0c;比如&#xff1a;基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据&#xff0c;输出流…

[每日AI·0501]GitHub 版 Devin,Transformer的强力挑战者 Mamba,Sora 制作细节与踩坑,OpenAI 记忆功能

AI 资讯 国资委&#xff1a;加快人工智能等新技术与制造全过程、全要素深度融合GitHub版 Devin 上线&#xff0c;会打字就能开发应用&#xff0c;微软 CEO&#xff1a;重新定义 IDE在12个视频理解任务中&#xff0c;Mamba 先打败了 TransformerSora 会颠覆电影制作吗&#xff…

无极花 专业韩语 朝鲜语网站建设

无极花 https://www.wujihua.com 无极花建站 - 始于2016年&#xff0c;专业的韩语、朝鲜语网站开发团队&#xff0c;从事网页设计、网站开发、网站托管、网站维护、网站推广、搜索引擎SEO优化等服务。

Qt5 框架学习及应用 — 对象树

Qt 对象树 对象树概念Qt为什么使用对象树 &#xff1f;将对象挂到对象树上 对象树概念 对象树&#xff1a;对于树的概念&#xff0c;相信许多学过数据结构的同学应该都不会陌生。在学习数据结构的时候我们所接触的什么二叉树、多叉树、哈夫曼树、AVL树、再到红黑树、B/B树………

力扣例题(接雨水)

链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路&#xff1a; 判断一块地方是否可以接到雨水&#xff0c;只需要判断他是否有左右边界使他可以接到水 左右边界分别为此处左侧的最高点和右侧的最高点 同时此处可接雨水的高度为左右两…

力扣每日一题104:二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2…

栈的表达式求值中的应用——逆波兰表达式求值+中缀表达式转后缀表达式

文章目录 1. 逆波兰表达式&#xff08;后缀表达式&#xff09;求值思路讲解AC代码 2. 中缀表达式转后缀表达式分析方法总结 3. 中缀表达式求值 1. 逆波兰表达式&#xff08;后缀表达式&#xff09;求值 链接: link 这道题目叫做逆波兰表达式求值&#xff0c;那什么是逆波兰表…

阿里云API网关 产品的使用笔记

阿里云的产品虽多&#xff0c;还是一如既往的一用一个看不懂&#xff0c;该模块的文档依旧保持“稳定”发挥&#xff0c;磕了半天才全部跑通。 用阿里云API网关的原因是&#xff0c;在Agent中写插件调用API的时候&#xff0c;需要使用Https协议&#xff0c;又嫌搞备案、证书等事…

【ROS学习】noetic环境搭建

ROS学习&#xff1a;环境搭建 在Ubuntu20.04系统中&#xff0c;搭建noetic环境。 官方资料&#xff1a; https://wiki.ros.org/noetic/Installation/Ubuntu 顺序执行以下所有指令 获取软件包 这里使用清华的镜像源&#xff0c;可以在https://wiki.ros.org/noetic/Installat…

办公数据分析利器:Excel与Power Query透视功能

数据分析利器&#xff1a;Excel与Power Query透视功能 Excel透视表和Power Query透视功能是强大的数据分析工具&#xff0c;它们使用户能够从大量数据中提取有意义的信息和趋势&#xff0c;可用于汇总、分析和可视化大量数据。 本文通过示例演示Power Query透视功能的一个小技…

JavaScript基础(四)

逻辑运算符 && 与 : 多个条件同时满足 ΙΙ 或 : 多个条件满足一个 &#xff01; 非 : 否定某个条件 例: <script> //&多个条件同时满足&#xff0c;才返回true //任意一个为false&#xff0c;就返回false var a 10; var b 20; …

主机win10,VMware 装了ubuntu,ubuntu传文件到主机

亲测可用&#xff0c;1分钟搞定&#xff0c;不能用你打死我 使用 FileZilla 工具互传 FileZilla是一款免费的工具&#xff0c;是基于 FTP 协议进行文件互传的&#xff0c;在传输过程中我们的ubuntu是作为服务器&#xff0c; FileZilla 工具则是作为客户端。 1 ubuntu安装 FTP…

typescript 对象数组和函数

typescript 对象数组和函数 对象 在JavaScript中&#xff0c;对象属于非原始类型。对象也是一种符合数组类型&#xff0c;由若干个对象属性构成。对象属性可以是任意数据类型&#xff0c;比如数组&#xff0c;函数或者对象等。当对象属性为函数的时候&#xff0c;称为方法。 …

基于Spring Boot的音乐网站与分享平台设计与实现

基于Spring Boot的音乐网站与分享平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首…

phpMyAdmin增加自定义IP登录教程

phpMyAdmin增加自定义IP登录教程 1、打开phpMyAdmin目录&#xff0c; 在此目录下是否有config.sample.inc.php文件&#xff0c;如果存在&#xff0c;那么将其改名为config.inc.php&#xff08;为避免修改失误所造成的损失&#xff0c;强烈建议先备份config.sample.inc.php文件…

matlab期末知识

1.期末考什么&#xff1f; 1.1 matlab操作界面 &#xff08;1&#xff09;matlab主界面 &#xff08;2&#xff09;命令行窗口 &#xff08;3&#xff09;当前文件夹窗口 &#xff08;4&#xff09;工作区窗口 &#xff08;5&#xff09;命令历史记录窗口 1.2 matlab搜索…

U盘启动树莓派系统操作流程(3B+)

步骤 使用SD Card启动修改树莓派硬件启动方式 已烧写好的SD Card先 config.txt文件最后一行配置 program_usb_boot_mode1 program_usb_boot_timeout1 ## 超时时间加大到5s, 避免硬件USB枚举时过长导致启动超时。 SD Card接入树莓派&#xff0c; 然后上电, 使用指令 vcgencm…

「2024年」前端开发常用工具函数总结 TypeScript

前言 在前端开发中&#xff0c;工具函数是提高代码复用率、保持代码整洁和增加开发效率的关键。使用 TypeScript 编写工具函数不仅可以帮助开发者捕捉到更多的类型错误&#xff0c;还可以提供更清晰的代码注释和更智能的代码补全。下面是一些在 TypeScript 中常用的前端开发工…

搜好货API接口:快速获取商品列表的利器

搜好货商品列表API接口允许开发者根据关键字搜索并获取相关的商品列表数据。接口支持多种参数配置&#xff0c;可以根据需求灵活调整搜索条件和结果返回格式。 点击获取key和secret API接口请求说明 请求地址&#xff1a;https://api.souhaohuo.com/goods/search请求方法&…

Java——认识异常

目录 一.异常的概念与体系结构 1.异常的概念 1.1算术异常 1.2数组越界异常 1.3空指针异常 2.异常的体系结构 3.异常的分类 3.1编译时异常 3.2运行时异常 二.异常的处理 1.防御式编程 1.1LBYL 1.2EAFP&#xff08;核心&#xff09; 2.异常的抛出 3.异常的捕获 3…
最新文章