vueJs中的watch与watchEffect函数

news2024/9/22 13:40:48

前言

有时,我们需要在状态变化时执行一些副作用,比如:监听路由状态,更改DOM,或是根据异步操作的结果去修改另一处的状态

这个时候,就需要用到监听器

在组合式API中,就可以使用watch函数在每次响应式状态发生变化时触发回调函数

01

使用watch监视ref

watch:监听某个属性的变化,一旦发生变化,就会触发对应的回调函数执行

  1. 第一个参数:选择要监听的属性

  2. 第二个参数: 设置的回调函数,即监听到变化时应该执行的函数

  3. 第三个参数: 可以设置deep(深度监听),其值为truefalse,还可以设置immediate(是否以当前值执行回调函数)其值为truefalse

如下示例代码所示,监视的几种情况

import {ref,reactive,watch} from "vue"

export default {
  name:'Demo',
  setup() {
    let sum = ref(0);
    let msg = ref("itclanCoder")
    let person =  reactive({
        name: 'itclanCoder',
        age: 6,
        job: 'webcoder'
    })
    //情况1:监听ref所定义的响应式数据,第一个参数是监视的是谁,第二个参数是监视的回调,第三个参数就是监视的配置
    // 监视
    watch(sum,(newValue,oldValue) => {
      console.log('sum变了',newValue,oldValue);
    },{immediate:true,deep: true})
    
    // 情况2:监视ref所定义的多个响应式数据
    watch([sum,msg],() => {
      console.log('sum或msg变了',newValue,oldValue);
    })

    /* 情况3:监视reactive所定义的一个响应式数据的全部属性
       1. 注意:此处无法正确的获取oldValue
       2. 注意:强制开启了深度监视(deep配置无效)
    */
    // 情况四:监视reactive所指定的一个响应式数据中的某个属性
    
    watch(person,(newValue,oldValue) => {
      console.log('person变化了',newValue,oldValue);
    })
    
    // 监视某个属性,必须要写成一个函数
    watch(() => person.name,(newValue,oldValue) => {
      console.log('person的age变化了',newValue,oldValue);
    })
     
     // 情况五:监视reactive所定义的一个响应式数据中的某些属性
     watch([() => person.name,()=> person.age],(newValue,oldValue)=> {
       console.log('person的name成age变化了',newValue,oldValue);
     }) 
     // 特殊情况,此处由于监视的是reactive定义的对象中的某个属性,所以deep配置有效
     watch(() => person.job,(newValue,oldValue) => {
       console.log('person的job变化了',newValue,oldValue);
     },{deep:true})   

    return {
      sum
    }
  }
}

watch()vue2.0的功能是一样的,侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数

02

watch存在一些问题

监视reactive定义的响应式数据时,oldValue无法正确获取,强制开启了深度监视(deep)配置失效

监视reactive定义的响应式数据中的某个属性时,设置deep配置有效

03

watchEffect()函数

立即运行一个函数,同时响应式的追踪依赖,并在依赖更改时重新执行

不用指明监视哪一个属性,监视的回调中用到哪个属性,那就监视哪个属性

watchEffect有些像computed,但computed注重的是计算出来的值(回调函数的返回值),必须要有返回值,而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值

// watchEffect所指的回调中用到的数据只要发生变化,则直接重新执行回调
watchEffect(() => {
    const x1 = sum.value;
    const x2 = person.age;
    console.log(watchEffect配置的回调执行了的);
})

watchEffect会在vue3开发中使用得比较多 如果有多个负效应,不要混写在一起,建议写多个watchEffect,如下所示

watchEffect(() => {
  setTimeout(() => console.log(a.val + 1), 1000);
});

watchEffect(() => {
  setTimeout(() => console.log(b.val + 1), 1000);
});

watchEffect也可以放在其他生命周期函数内

比如:副作用函数在首次执行时就要调用DOM,可以把它放在onMounted钩子里

onMounted(() => {
    watchEffect(() => {

    })
})


04

watch和watchEffect的区别

watch可以访问新值和旧值,watchEffect不能访问

watchEffect有副作用,DOM挂载或更新之前就会触发,需要我们自己去清除副作用

watch是惰性执行,也就是只有监听的值发生变化的时候才会执行,但是watchEffect不同,每次代码加载watchEffect都会执行

watch需要指明监听的对象,也需要指明监听的回调。watchEffect不用指明监视哪一个属性,监视的回调函数中用到哪个属性,就监视哪个属性

总结

watch的使用与Vue2差不多,但需要用vue当中引入,需要指明监听对象,也需要指明监听回调,而Vue3新增了watchEffect,它不用指明监视哪一个属性

2022-年终总结-忙碌的一年

2022-12-30

972b913246cf1d3050b500f0cf14a4c6.jpeg

VueJs中的ref函数

2022-12-29

dac19a16bb7e4db656376b052eff0daf.jpeg

VueJs中setup的使用(下)

2022-12-29

1c980dc5e1c279e6327dbb971d0cfcf4.jpeg

如何解决chrome浏览器显示您要访问的是诈骗网站解决办法

2022-12-28

cbef7de9c95ff921d44ff2f22996ffac.jpeg

vuejs中组件的两种不同的编写风格-选项式API及组合式API

2022-12-28

fbb115e3a89f85bbb976e246a9d27510.jpeg
点击左下角查看更多

06bf77d24e8dc26766cffdf969435644.gif

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

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

相关文章

2023.01/1801. 积压订单中的订单总数

1801. 积压订单中的订单总数 题意: 给你一个二维整数数组 orders ,其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种: 0 表示这是一批采购订单 buy …

3D打印:FDM打印使用CURA4.13.1版本配置

一、前言 今天是2023年1月1日,新年阳历的第一天,在整理CSDN和写年度计划,对2022的总结,就像写一篇博客来分享一下我2022年积累的最多的一项经验,就是使用3D打印机,在2022年我先后入手了3台3d打印机&#x…

聊聊数字化转型是个啥

“国有企业首要的职责,就是实现国有资产保值增值。这是衡量国企工作优劣的关键!” ——李克强 如果你开了一家制衣厂,雇佣了10个员工买了10台缝纫机,假设一天可以生产100件衣服。 做老板的你想要提高这家工厂的生产数量&#xff0…

禾元生物冲刺科创板上市:累计亏损超4亿元,贝达药业为主要股东

12月30日,武汉禾元生物科技股份有限公司(下称“禾元生物”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,禾元生物计划募资35.02亿元,将用于植物源重组人血清白蛋白产业化基地建设项目、新药…

更多的可能

1986年12月,路遥的《平凡的世界》出版了,1992年11月17日路遥去世了,享年43岁,距今30年了……人的一生常常是白驹过隙,忽然而已,人们也常常用星空里的流星比喻,细细想来,这还算是夸张…

IDEA集成Gitee,超简单

1. 在IDEA下载Gitee插件 file-Settings-Plugins搜索Gitee,并且install这样IDEA就集成了Gitee 2. 从远程仓库拉取项目 如果打开IDEA已经有项目了,那就先file-close退出,回到这个初始化页面VCS:version control system版本控制系…

怎样提升go中的RSA解密速度2~3倍

背景 我们的业务中大量的使用了RSA加密后的数据包,每个数据包大概17-30K不等,因为从php迁移到go,RSA解密业务是无法避免的,之前一直以为迁移后go的解密速度即使没有php快,但也应该相同因此使用了go中x509.ParsePKCS1PrivateKey和…

公务员国考省考小白需知

文章目录: 一:分类 国考 省考 二:必备途径 1.相关网站 1.1 官网 1.2 机构 1.3 时事 1.4 资源 2.相关公主号 3.应用 三:相关需知 1.考试内容 2.老师选择 3.相关 4.公务员行政级别划分表 一:分类 国考…

嵌入式:ARM最小系统设计详解

文章目录一、什么是最小系统最小系统结构框图最小系统例板嵌入式最小系统硬件功能二、时钟和功率管理( 一 ) 时钟管理1、时钟电路结构2、锁相环 PLL( 二 ) 功率管理正常模式空闲模式低速模式掉电模式三、电源电路设计四、复位电路设计五、JTAG电路六、存储器扩展特性存储器映射…

程序员面试金典8.*

文章目录8.1三步问题8.2迷路的机器人8.3魔术索引8.4求幂集8.5递归乘法8.6 汉诺塔8.7无重复字符串的排列组合(☆)8.8有重复字符的排列组合8.9括号8.10颜色填充8.11硬币8.12八皇后8.1三步问题 一个基础的动态规划问题,pass dp[i]dp[i-1] dp[i-2] dp[i-3] dp[1]1, dp[…

linux系统中串口驱动的基本实现原理

大家好,今天主要和大家聊一聊,如何利用linux系统中的串口驱动。 目录 第一:linux系统中UART驱动框架 第二:uart_ops的具体实现 第三:串口驱动设备树的添加 第一:linux系统中UART驱动框架 向SPI一样&am…

ansible第二天作业

## 安装并且配置ansible 1)安装和配置ansible以及ansible控制节点server.example.com如下: 2)创建一个名为/home/student/ansible/inventory的静态库存文件如下所示: 2.1)node1 是dev主机组的成员 2.2)node2是test主机组的成员 2.3)node1和node2是prod主…

【JAVA】生产消费者问题

生产者/消费者问题是一个共享资源的问题,即生产者生产的产品不能超过最大存储量,而消费者消费的产品不能多于剩下的产品数量。 解决方法有很多种,这里通过同步线程锁: synchronized 但是仅仅使用线程锁是不足的,因为…

ElasticsSearch7.6.1学习笔记【狂神说Java】

文章目录一、ElasticSearch概述二、安装elasticsearch-7.6.1,基于windows 101、解压安装包以及目录结构介绍2、安装可视化插件elasticsearch-head3、解决跨域问题三、安装Kibana四、核心概念五、IK分词器插件1、什么是ik分词器2、解压3、进入kibana测试4、自定义扩展…

状态压缩DP——蒙德里安的梦想

状态压缩DP——蒙德里安的梦想一、题目描述二、思路分析1、状态表示——状态压缩2、状态转移3、循环4、初始化三、代码一、题目描述 二、思路分析 这道题中,其实刚一看是非常的抽象的,也是非常麻烦的。麻烦的点在于我们既需要考虑横着放的方块&#xff…

【Linux】shell命令以及运行原理和Linux权限的理解

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🚲Linux 📕 学习格言:博观而约取,厚积而薄发 …

VBA之正则表达式(39)-- 提取规格数据(2/2)

实例需求:A列为某产品名称,现需要提取其中的规格数据,具体规则如下: 规格数据以如下关键字开头:RO、RE、SQ、SD、QD、OB、HX、ET、QR、D2规则数据可能有多段(截图中红色部分)提取规格数据之后&…

SpringBoot简单功能分析,静态资源访问和静态资源配置原理解析

目录 1、SpringMVC自动配置概览 2、简单功能分析 2.1、静态资源访问 1、静态资源目录 2、静态资源访问前缀 3、webjar 2.2、欢迎页支持 2.3、自定义 Favicon 2.4、静态资源配置原理 1、SpringMVC自动配置概览 官网Web (spring.io) Spring Boot provides auto-configur…

论文综述——UNIRE: A Unified Label Space for Entity Relation Extraction

UNIRE: A Unified Label Space for Entity Relation Extraction1 任务介绍2 UniRE模型3 实验4 总结1 任务介绍 过构建标签空间来对实体和关系进行联合抽取的方法。 实体关系抽取旨在提取文本中的实体并检测它们的实体类型,以及对每个实体对检测它们的关系。作者提…

MAX78000FTHR简单介绍与初次上手

特点 MAX78000FTHR是基于MAX78000的小型板微控制器单元(MCU)。 该 MCU 面向在边缘运行的人工智能 (AI) 应用程序。在这种情况下,“边缘”并不意味着技术的前沿(尽管这就是芯片);这意味着靠近需要它的地方…