当前位置: 首页 > news >正文

watchEffect 函数 与 watch 函数的区别

在上一篇博文中讲的是 watch函数的使用以及踩坑,但是在使用过程中我们可以感觉的到并不是很方便,既要指定需要监听的属性,又要指明监听的回调,而且监听对象存在多种不同类型:例如变量,数组,函数,数组中包含函数等等,所以 Vue3 提供了一个新的 API -- watchEffect 来解决这些问题

watchEffect 与 watch 的区别

 首选需要明确的是 watchEffect  也是用来监听数据变化的,但是和 watch 存在很大不同。

第一点:watchEffect 不需要指定监听的属性,而是直接触发监听的回调函数

watchEffect(() => {console.log('watchEffect监听被触发了');
})

可以看到,当我的页面刷新之后,watchEffect 在初始化时会被直接触发,相当于 watch 中配置的immediate: true 

第二点:watchEffect 回调函数中不接收 newValue 和 oldValue 的形参

 其实我们也可以想得到,我都没有指定监听的属性,我去哪里拿值呢?

watchEffect((a,b,c,d) => {console.log(a,b,c,d,'watchEffect监听被触发了');
})

从控制台打印的参数可以发现,除了第一个参数存在,其他的都是undefined。且第一位形参还是一个底层函数,并不是一个可以使用的值。

第三点:watchEffect 在进行深度监测时并不需要进行配置 deep: true 

案例参考下面 watchEffect 函数监听复杂类型数据的案例

 watchEffect 函数的使用

经过上面描述的与 watch 的区别,我们大致了解了 watchEffect 函数,那么他到底是怎么实现响应式的呢?

监听基础数据

let sum = ref(0);watchEffect(() => {let x = sum.value;console.log("watchEffect监听被触发了");
});

我们通过 ref 函数定义了一个基础数据类型的响应式 ,然后在 watchEffect 函数中访问该响应式数据,最后我们惊奇的发现,除了初始化时监听的一次之外,当我在点击按钮之后,该 watchEffect 还会触发一次。

如果换成复杂类型的数据会怎么办呢?通过 reactive 函数定义了一个深层嵌套响应式对象,然后访问其中的某个属性

<template><p>工作:{{ person.job.j1.work }}  工资:{{ person.job.j1.salary }}</p> <button @click="person.job.j1.salary++">涨薪</button>
</template>let person = reactive({name:'al',job: {j1: {work: "前端",salary: 1,},},
});watchEffect(() => {let y = person.job.j1.salaryconsole.log("watchEffect监听被触发了");
});

然后我们发现,它和上面的例子最终的展示效果是一样的,初始化监听一次,按钮触发后继续监听,这也表示了 watchEffect 函数会自动实现深层监听,对应上面的 第三点区别

这个时候我们对于 watchEffect 函数的基本使用就已经完成了,就是这么简单。

总结

watch:

  • 既要指明监听的属性,
  • 也要指明监听的回调,
  • 且回调形参存在新值和旧值两个参数
  • 深度监听在监听完整对象时会默认开启,但是在监听深度嵌套对象中某个值为对象的属性时,需要手动开启。

watchEffect:

  • 不用指明监听的属性
  • 需要指明监听回调
  • 但是回调中不接收形参
  • 默认可以进行深度监听

watchEffect 的套路是:不用特定指明监听哪个属性,只要在回调函数中用到了那个属性,watchEffect 就是自动监听哪个属性的变化,如果数据变化了,则直接重新执行回调。如果存在很复杂的逻辑需要处理,那使用 watchEffect 无疑是非常方便的,不然我们还需要通过 watch 一个个监听然后去处理,即分散了逻辑,也增加了工作量。

watchEffect 有点像 computed,但是存在区别:

 computed 关注的是值(回调函数的返回值),所以必须要有返回值

但是 watchEffect 和 watch 注重的是过程(回调函数的函数体逻辑),所以不需要写返回值

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTTP 请求流程
  • LeetCode 234 - 回文链表 C++ 实现
  • 设计模式之结构型模式
  • 深入浅出:理解TCP传输控制协议的核心概念
  • Go 语言错误处理
  • keepalive原理详解及应用
  • Windows采用VS2019实现Open3D的C++应用
  • ~Keepalived高可用集群~
  • CAPL使用结构体的方式组装一条DoIP车辆识别请求报文(payload type 0x0002)
  • [Datawhale AI夏令营 2024 第四期] 从零入门大模型微调之旅的总结
  • wordpress网站“ERR_CONNECTION_REFUSED”错误
  • string模拟
  • leetcode 21-30(2024.08.16)
  • P2460[SDOI2007] 科比的比赛
  • PyTorch--深度学习
  • DOM的那些事
  • eclipse的离线汉化
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • spring security oauth2 password授权模式
  • Terraform入门 - 3. 变更基础设施
  • VuePress 静态网站生成
  • 创建一种深思熟虑的文化
  • 技术:超级实用的电脑小技巧
  • 盘点那些不知名却常用的 Git 操作
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 与 ConTeXt MkIV 官方文档的接驳
  • 原生Ajax
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (06)Hive——正则表达式
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (a /b)*c的值
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (MATLAB)第五章-矩阵运算
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (分布式缓存)Redis持久化
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (计算机网络)物理层
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (算法)Travel Information Center
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET 使用配置文件
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [1]-基于图搜索的路径规划基础
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [AutoSar]BSW_Com02 PDU详解
  • [BSGS算法]纯水斐波那契数列
  • [C++][opencv]基于opencv实现photoshop算法图像剪切