Vue3-18-侦听器watch()、watchEffect() 的基本使用

什么是侦听器

个人理解:
    当有一个响应式状态(普通变量 or 一个响应式对象)发生改变时,我们希望监听到这个改变,
    并且能够进行一些逻辑处理。
    那么侦听器就是来帮助我们实现这个功能的。
侦听器 其实就是两个函数,watch() 或者是 watchEffect() 。
watch() 的特点: 被侦听的数据源非常明确,逻辑代码与被侦听的数据源相互独立,可维护性较好;
watchEffect() 的特点:
    出现在这里边的响应式状态就会被监听,(就是被监听的数据源 和 逻辑代码 写在一起了);
    watchEffect() 的监听是立即执行的,不是非得等到值发生改变时才开始执行。
       
下面通过案例来体会一下它们的用法。

watch 侦听器

语法格式:
watch(被监听的响应式状态,(新值,旧值)=>{ 逻辑代码 },{可选的配置对象})
一共有 三个参数:
参数1 : 指定被监听的状态,可以是一个变量或对象
参数2 :监听到之后的响应回调函数,
参数3 :其他的属性配置,可选的,不是很常用


【注意】:
   watch第一个参数可以同时监听多个状态,写成数组的形式,但是笔者不建议这样使用,如果想监听多个状态,可以分开一个一个的写嘛。

watch 监听一个 ref 的普通响应式状态

这是最基本的使用,直接上代码:
一个文本输入框,
一个普通的响应式变量,
当文本输入框中的内容发生改变时,在侦听器的逻辑中修改 普通变量的值。

<template>

    <!-- 监听器的使用 -->
    <div>
        <!-- 普通的响应式状态 -->
        textValue : <input type="text" v-model="textValue">
        <br>
        otherValue1 : {{ orhterValue1 }} 
        <br>
        
    </div>
    
</template>
    
<script setup lang="ts">

    import { ref,watch } from 'vue'

    // 声明一个 文本输入框的值
    const textValue = ref('这是文本输入框')

    // 声明一个 变量,当 textValue 发生变化时,这个变量也发生变化
    const orhterValue1 = ref('')

    // 监听 textValue 这个变量的状态变化
    watch(textValue,(newValue:string,oldValue:string)=>{
        console.log(`oldValue is ${oldValue}`)
        console.log(`newValue is ${newValue}`)
        console.log(`textValue is ${textValue.value}`)

        // 当textValue 的值发生改变时,我们修改 otherValue1 的值
        orhterValue1.value = '改变了'+new Date().getTime()
    })


</script>
    
<style scoped>
</style>

运行效果:

初始状态文本框改变之后
在这里插入图片描述在这里插入图片描述

watch 监听一个reactive的响应式对象

当想监听一个对象是否发生改变时,需要使用reactive 创建响应式对象;
而且,这个监听是深度监听,即,无论这个对象的属性有多少层,都能够被监听到;
而且,监听的回调函数的两个参数都是一样的,全都是新值对象,因为这就是一个对象!(这一条可能比较晦涩难懂,记住就行了)

案例 :
有一个响应式的对象,
有一个按钮,
点击按钮,改变对象的某个属性,触发侦听器的逻辑

<template>

    <!-- 监听器的使用 -->
    <div>

        <!-- 监听一个对象 -->
        stu : {{ stu }}
        <br>
        <button @click="changeStu">点击修改对象的属性</button>
        
    </div>
    
 
</template>
    
<script setup lang="ts">

    import { reactive,watch } from 'vue'

    // 声明一个响应式的对象
    const stu = reactive({
        id:100,
        name:'小红',
        classInfo:{
            classId:'001',
            className:'快乐足球一班'
        }
    })

    // 修改对象的属性的方法
    const changeStu = ()=>{
        stu.classInfo.className = '拒绝踢足球二班'
    }

    // 监听对象发生了变化 : 需要使用 reactive
    // 且此处的 newValue 和 oldValue 是一样的,因为它是一个对象,都是更新后的值
    watch(stu,(newValue,oldValue)=>{
        console.log(`oldValue is `,oldValue)
        console.log(`newValue is `,newValue)
        console.log(`stu is `,newValue)

    })


</script>
    
<style scoped>
</style>

运行效果:

在这里插入图片描述

watch 监听一个对象的某个属性

通过 getter 方法的形式,将对象的属性作为被侦听的对象。
getter方法 : 其实就是写一个简单的函数,返回被侦听的对象。
这种监听,无论是 ref 还是 reactive 声明的响应式对象,都是可以的。

案例 :
有一个响应式的对象,
有一个按钮,
点击按钮,改变对象的某个属性,触发侦听器的逻辑

<template>

    <!-- 监听器的使用 -->
    <div>
     
        <!-- 监听一个对象的其中的某个属性 -->
        stu : {{ stu }}
        <br>
        <button @click="changeStu">点击修改对象的属性</button>

    </div>

</template>
    
<script setup lang="ts">

    import { reactive,watch } from 'vue'

    // 声明一个响应式的对象
    const stu = reactive({
        id:100,
        name:'小红',
        classInfo:{
            classId:'001',
            className:'快乐足球一班'
        }
    })

    // 修改对象的属性的方法
    const changeStu = ()=>{
        stu.classInfo.className = '拒绝踢足球二班'
    }

    // 通过getter 函数的方式监听对象某个属性的值
    watch(
        ()=> stu.classInfo.className,
        (newValue,oldValue)=>{
            console.log(`oldValue is `,oldValue)
            console.log(`newValue is `,newValue)
            console.log(`stu is `,newValue)
        }
    )
    
</script>
    
<style scoped>

</style>

运行效果:

在这里插入图片描述

watchEffect侦听器

特点 :
只要是出现在 watchEffect 中的响应式的状态,就会被纳入监听,
当响应式状态发生改变时,会自动触发侦听器的逻辑。
它可以比较方便的监听多个状态值,但是,只要有一个值触发了,就会把整个的侦听逻辑执行一遍!

案例 :
一个文本输入框,可以监听文本输入框的值;
一个按钮,点击修改 对象的一个属性,该属性被侦听器监听;

<template>

    <!-- 监听器的使用 -->
    <div>
        <!-- 普通的响应式状态 -->
        textValue : <input type="text" v-model="textValue">
        <br>

        <hr>
        <!-- 监听一个对象 -->
        stu : {{ stu }}
        <br>
        <button @click="changeStu">点击修改对象的属性</button>

    </div>
    
</template>
    
<script setup lang="ts">

    import { ref,reactive,watchEffect} from 'vue'

    // 声明一个 文本输入框的值
    const textValue = ref('这是文本输入框')

    // 声明一个响应式的对象
    const stu = reactive({
        id:100,
        name:'小红',
        classInfo:{
            classId:'001',
            className:'快乐足球一班'
        }
    })

    // 修改对象的属性的方法
    const changeStu = ()=>{
        stu.classInfo.className = '拒绝踢足球二班'
    }

    // 通过 watchEffect 进行监听
    watchEffect(()=>{
        // 监听普通的属性
        if(textValue.value.length > 7){
            console.log('检测到了 textValue 属性的修改')
            console.log('textValue : ',textValue.value)
            console.log('---------------')
        }

        // 监听对象的属性
        if(stu.classInfo.className.length > 6){
            console.log('检测到了className属性的修改')
            console.log('className : ',stu.classInfo.className)
            console.log('---------------')
        }
    })

</script>
    
<style scoped>
</style>

运行效果:

在这里插入图片描述

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

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

相关文章

JAVA 版多商家入驻 直播带货 商城系统 B2B2C 之 鸿鹄云商B2B2C产品概述

随着互联网的快速发展&#xff0c;越来越多的企业开始注重数字化转型&#xff0c;以提升自身的竞争力和运营效率。在这个背景下&#xff0c;鸿鹄云商SAAS云产品应运而生&#xff0c;为企业提供了一种简单、高效、安全的数字化解决方案。 鸿鹄云商SAAS云产品是一种基于云计算的软…

Seata配置

参考教程 seata 分布式事务的环境搭建与使用 Seata 1.4.0 nacos配置和使用&#xff0c;超详细 Seata 1.4.2 的安装 Nacos的配置和使用 官网下载地址 本文以v1.4.1为例 1.数据库及表的创建 创建seata数据库&#xff0c;创建以下表&#xff08;右键连接-》新建数据库seata-》…

一文读懂FastAPI:Python 开发者的福音

FastAPI是一个基于Python的现代化Web框架&#xff0c;它提供了快速、简单和高性能的方式来构建API。 它结合了Python的静态类型检查和自动化文档生成的功能&#xff0c;使得开发API变得更加容易和高效。 下面将介绍如何使用FastAPI快速开发接口&#xff0c;并且利用自动生成的…

leetcode做题笔记2132. 用邮票贴满网格图

给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中&#xff0c;且满足以下 限制 和 要求 &#xff1a; 覆盖…

OpenKylin安装idea

Web和客户端都支持Linux了&#xff0c;一方面为了Linux上调试程序方便&#xff0c;另一方面为了把开发环境彻底支持Linux&#xff0c;在Linux上安装idea运行代码&#xff0c;之前剔除Maven那些的优点就来了&#xff0c;在OpenKylin上我只要安装idea和jdk就能正常运行代码了。最…

【c】数组元素移动

本题的难点之处就是不让你创建新的数组&#xff0c;而且移动的距离也没有给限制&#xff0c;比如有7个数&#xff0c;本题没有限制必须移动距离小于7&#xff0c;也可能移动的距离大于7&#xff0c;甚至更多&#xff0c;下面附上我的代码 #include<stdio.h>int main() {…

2.两数相加

借文引流&#xff1a;五点钟科技_大道至简系列,机器学习算法系列,学习经验分享-CSDN博客 欢迎大家阅览我的其它专栏。 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数…

21. python __init__.py 文件的行为

重复打印行为分析 说明结论主模块主模块所在位置不会被python认为是包 说明 我在调试代码的时候&#xff0c;发现上面的print打印了两次&#xff0c;如果将图片中的 from aaa.F import Cat 改成 from F import Cat 则print只会打印一次。这是为什么呢&#xff1f; 结论 from …

每日一题:实现方法fn,遇到退格字符就删除前面的字符,遇到俩个退格就删除俩个字符

每日一题 请按以下要求实现方法fn,遇到退格字符就删除前面的字符&#xff0c;遇到俩个退格就删除俩个字符&#xff1a; // 比较含有退格的字符串&#xff0c;"<-"代表退格键&#xff0c;"<"和"-"均为正常字符 // 输入&#xff1a;"…

OSWBB 部署实现

1、OSWatcher (oswbb) 是一个可供用户下载的工具&#xff0c;可以用来抓取操作系统的性能指标。 是一组shell程序&#xff0c;程序中调用: top, vmstat, iostat, mpstat, netstat,and traceroute等os的监控工具 。OSWatcher 的使用是基于 standard licensing terms 并且不需要…

『OPEN3D』1.8.3 多份点云配准

多份点云配准是将多份点云数据在全局空间中对齐的过程。通常,输入是一组数据(例如点云或RGBD图像){Pi}。输出是一组刚性变换{Ti},使得经过变换的点云在全局空间中对齐。 NNNNNathan 本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html 此处是…

最新CRMEB商城源码开源版v5.2.2版本+前端uniapp

CRMEB开源商城系统是一款全开源可商用的系统&#xff0c;前后端分离开发&#xff0c;全部100%开源&#xff0c;在小程序、公众号、H5、APP、PC端都能用&#xff0c;使用方便&#xff0c;二开方便&#xff01;安装使用也很简单&#xff01;使用文档、接口文档、数据字典、二开文…

5G边缘网关如何助力打造隧道巡检机器人

我国已建成全世界里程最长的公路网、铁路网&#xff0c;是国民经济发展与国家现代化的重要支撑。我国幅员辽阔&#xff0c;地理环境复杂&#xff0c;公路/铁路的延伸也伴随着许多隧道的建设&#xff0c;由于隧道所穿越山体的地质条件复杂&#xff0c;对于隧道的监测、管理与养护…

C++共享和保护——(3)静态成员

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 信念&#xff0c;你拿它没办法&#x…

zabbix简单介绍2

学习目标: 能够实现一个web页面的监测能够实现自动发现远程linux主机能够通过动作在发现主机后自动添加主机并链接模板能够创建一个模版并添加相应的元素(监控项,图形,触发器等)能够将主机或模板的配置实现导出和导入能够实现至少一种报警方式(邮件,微信等)能够通过zabbix_pro…

【数据结构入门精讲 | 第一篇】打开数据结构之门

数据结构与算法是计算机科学中的核心概念&#xff0c;也与现实生活如算法岗息息相关。鉴于全网数据结构文章良莠不齐且集成度不高&#xff0c;故开设本专栏&#xff0c;为初学者提供指引。 目录 基本概念数据结构为何面世算法基本数据类型抽象数据类型使用抽象数据类型的好处 数…

短视频自媒体创作者都在用的去水印小程序

如今可以发短视频的平台越来越多&#xff0c;我们经常看到喜欢的视频想下载下来&#xff0c;或者当做手机壁纸&#xff0c;由于直接下载下来视频都会带有平台的水印&#xff0c;让我们用着看起来非常不美观&#xff0c;所以我们就要想办法去掉这个水印&#xff0c;下载没有水印…

arthas一次操作实现递归分析下游方法的耗时

背景 使用arthas的trace分析方法的耗时时&#xff0c;我们一般只能分析下一层的方法的耗时&#xff0c;然后一层一层的递归进去找到耗时最长的那个方法&#xff0c;有没有一种方式可以一次trace分析就可以把所有要关注的下层所有的耗时都打印出来&#xff1f; 解决方式 使用…

物奇平台TWS蓝牙耳机频响曲线问题

物奇平台TWS蓝牙耳机频响曲线问题 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送蓝牙音频&#xff0c;DSP音频项目核心开发资料, 1 高频有抖动 2 物奇原厂频响曲线

第三方电脑小爱同学用快捷键唤醒

第三方电脑安装小爱同学-CSDN博客 请结合之前安装小爱同学的教程安装过程请提前取消windows更新 安装完成之后登录账号即可使用 Ahk2.0 下载地址&#xff1a;https://www.autohotkey.com/download/ahk-v2.zip 打开链接即可自动下载&#xff0c;下载后解压出来点击install.cmd安…