Vue3中computed、watch、watchEffect的区别

三者都是侦听工具,实现的是观察者模式,横向对比


(1)依赖:指的是响应性依赖,也就是侦听 ref、reactive 这类具有响应性的对象。
(2)watch:默认情况下,被侦听对象变化时才会执行,但是可以通过 options 参数设置为可以立即执行

computed

computed 这个单词比较有误导性,看表面是计算用的,但是除了计算之外还可以有其他的功能,比如做个判断、做个序列化、赋值等。

但这些都不是重点,重点是,它和 watch 一样,是侦听用的。

自动侦听 getter 里有响应性的对象,当发生变化时重新执行一次 get 函数,将返回结果存入 _value 缓存,并且通知 template 刷新页面。
所以说,计不计算的不是重点,侦听才是重点。

基础示例

举个例子,我想在网页里看看对象的序列化,用 computed 的实现方式
 


定义一个 reactive 和 一个 computed,使用 JSON.stringify 实现序列化。
 


 自动收集依赖,侦听 model 的变化,序列化之后交给 template 的 el-input。这样我们就可以在网页里面实时看到对象的序列化情况了。

结构和本质

我们打印一下 computed ,看看结构: 
 


 看起来挺复杂的,其实简化一下就简单了,主体是一个 class,其中有若干“私有成员”,然后用访问器实现我们常用的 value 属性,即: 
 


 主要结构是这样,当然还需要很多细节才能实现 computed 的功能,如果对细节感兴趣的话,可以看看 Vue 的源码。

计算属性缓存

其实看看源码就好理解了,执行 get 方法时,会把返回值存入 _value ,template 直接从 _value 属性获取数据,在需要更新缓存的时候才会调用 getter,这样就实现了缓存功能。也就是说,使用 _value 属性缓存了执行结果。

可以赋值的方式

computed 也可以开启赋值模式,方法就是传入一个对象,拥有 get 和 set 的对象,可以用在 props 在模板上的绑定。props 的属性是只读的,不能用于 template 的 v-model,那么怎么办?我们可以使用 computed 的赋值模式作为中转站:
子组件:
 


在子组件里面定义 props 和 emit,然后可以用computed实现“中转”功能,get 里面获取 props 的属性值,set 里面使用 emit 提交更改申请。当然,现在 Vue3.3+ 推出了语法糖 defineModel,就不需要我们自己折腾了。

watch

composition API 的 watch 非常好理解,他是一个函数,第一个参数要指定一个被侦听对象,第二个参数是回调函数,在被侦听的对象发生变化时,执行回调函数。

基础示例

还是上面那个例子,我们看看用 watch 如何实现:(watch 并不适合实现这样的需求,这里仅做对比)
 


 我们先定义一个 ref,然后用 watch 侦听 model,发生变化的时候再做序列化的操作,给 ref 赋值。
对比一下就会发现,对于这种简单的需求,使用 watch 明显没有使用 computed 方便。
不过 watch 可以明确指定侦听的对象,这样对于复杂的情况就不容易乱,不用担心自动收集依赖,把不想被侦听的对象也给收集进来。

watchEffect

一开始没弄明白 watchEffect,后来把三者放在一起一对比就好懂了。
和 computed 对比,相当于没有返回值的 computed,当然也不能 set。
和 watch 对比,可以自动收集依赖,无需手动指定。
这样想就清晰了,排列组合的结果。
是否自动收集依赖、是否有返回值组合一下,
自动收集依赖、无返回:watchEffect
自动收集依赖、有返回:computed需要指定依赖、无返回:watch

基础示例

还是上面那个例子:
 


 不需要自定侦听对象,而是像computed那样可以自动收集,然后还是当model变化时执行序列化的操作,赋值给 ref。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

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

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

相关文章

Spring AOP常见面试题

目录 一、对于AOP的理解 二、Spring是如何实现AOP的 1、execution表达式 2、annotation 3、基于Spring API,通过xml配置的方式。 4、基于代理实现 三、Spring AOP的实现原理 四、Spring是如何选择使用哪种动态代理 1、Spring Framework 2、Spring Boot 五…

CUDA入门之统一内存

原文来自CUDA 编程入门之统一内存 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质…

X64 页表结构

PML4(Page Map Level 4)是x86-64架构中用于管理虚拟内存地址翻译的四级页表结构之一。它是一种树形结构,由多个页目录表(Page Directory Pointer Table,PDPT)组成,每个PDPT有512个指向下一级页表…

低功耗DC-DC电压调整器IU5528D

IU5528D是一款超微小型,超低功耗,高效率,升降压一体DC-DC调整器。适用于双节,三节干电池或者单节锂电池的应用场景。可以有效的延长电池的使用时间。IU5528D由电流模PWM控制环路,误差放大器,比较器和功率开关等模块组成。该芯片可在较宽负载范围内高效稳…

1_springboot_shiro_jwt_多端认证鉴权_Shiro入门

1. Shiro简介 Shiro 是 Java 的一个安全框架,它相对比较简单。主要特性: Authentication(认证):用户身份识别,通常被称为用户“登录”,即 “你是谁”Authorization(授权&#xff…

webpack-dev-server5.0+ 版本问题

webpack-dev-server版本选择 在使用webpack-dev-server搭建新项目时,需要依赖node 和webpack以及webpack-cli 这是需要注意各个应用之间的版本问题 通过npm官网查看webpack-dev-server使用的版本依赖对象 先看package.json,可以看到当前的版本 再找到依…

YOLOv9使用训练好的权重检测目标

打开yolov9-main\detect.py文件 1修改为训练后权重文件的位置 2改为要检测图片的位置 3修改成数据集的yaml文件 运行detect.py文件并解决报错 打开报错文件yolov9-main\utils\general.py,在prediction = prediction[0]后边加上[0] 继续运行detect.py,成功检测 存在问题 当…

9个免费游戏后端平台

在这篇文章中,您将看到 九个免费的游戏服务平台提供商,这可以帮助您开始在线多人游戏,而无需预先投入大量资金。 每个提供商都有非常独特的功能,因此成本应该只是决定时要考虑的方面之一。 我还从低预算项目的角度对免费提供商进…

如何在Ubuntu系统部署DbGate数据库管理工具并结合cpolar内网穿透远程访问

文章目录 1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数据库管理工…

WordPress供求插件API文档:获取市场类型

请注意,该文档为: WordPress供求插件:一款专注于同城生活信息发布的插件-CSDN博客文章浏览阅读396次,点赞6次,收藏5次。WordPress供求插件:sliver-urban-life 是一款专注于提供同城生活信息发布与查看的插件…

CSS伪类与常用标签属性整理与块级、行级、行级块标签(文本,背景,列表,透明,display)

目录 文本 color:字体颜色 font-size:字体大小​编辑 front-family:字体 text-align:文本对齐 text-decoration:line-through:定义穿过文本下的一条线 text-decoration:underline:定义文本下的一条线…

mysqld.exe运行时,提示缺少msvcr100.dll,msvcp100.dll文件,导致mysql安装失败或mysql服务无法启动

mysqld.exe运行时,提示缺少msvcr100.dll,msvcp100.dll文件,导致mysql安装失败或无法启动 msvcr100.dll,msvcp100.dll时VC2010的动态链接库。 1、下载地址 https://www.microsoft.com/zh-cn/download/details.aspx?id26999&wd…

027—pandas 不同分类每天指定取值的比例

前言 本例我们将进行分组计算,分组后得到一个堆叠数据,并对堆叠数据解除堆叠,最后再按要求格式化为百分数样式。 此类操作会经常发生在业务数据透视场景下,一般都会有 Excel 来操作完成,今天我们使用 Python 的 panda…

钉钉扫码登录,sdk问题

别问我为啥会写这玩意。因为有人问到了 1.钉钉扫码登录,网上代码一大堆,但是小同学在抄的时候突然问我,为啥jar包倒入不了。pom添加了,镜像也是阿里的,还是不行 下载了包,按这个放啊发去操作就好了 1.先…

1.Datax数据同步之Windows下,mysql数据同步至另一个mysql数据库

目录 前言步骤操作大纲步骤明细其他问题 前言 Datax是什么? DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、SQL Server、Oracle、PostgreSQL、HDFS、Hive、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。准备…

Hand 3D相关

看到一个不错的文献总结网址,如下 GitHub - SeanChenxy/Hand3DResearch 涉及的内容如下图:

基于SSM框架的民族文化传承与乡村扶贫网站设计与实现【附项目源码】分享

民族文化传承与乡村扶贫网站设计与开发: 源码地址:https://download.csdn.net/download/qq_41810183/88842794 一、引言 随着信息技术的飞速发展,互联网已成为文化传播与经济发展的重要平台。为了有效传承和弘扬民族文化,同时推动乡村地区…

【Linux】Shell编程【一】

shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell属于内置的…

Docker上部署LPG(loki+promtail+grafana)踩坑复盘

Docker上部署LPG(lokipromtailgrafana)踩坑复盘 声明网上配置部署踩坑多机采集 声明 参考掘金文章:https://juejin.cn/post/7008424451704356872 版本高的用docker compose命令,版本低的用docker-compose 按照文章描述&#xff0c…

应急响应-Webshell-典型处置案例

网站后台登录页面被篡改 事件背景 在2018年11月29日4时47分,某网站管理员发现网站后台登录页面被篡改,“中招”服务器为windows系统,应采用java语言开发,所使用的中间件为Tomcat。 事件处置 Webshell排查 利用D盾对网站目录进…