直击Vue2/3watch的底层逻辑,字符串长度对侦听效率的影响

目录

直击Vue2/3watch的底层逻辑,字符串长度对侦听效率的影响

一、Vue 2的底层原理

二、Vue 3的底层原理

三、基础类型性能消耗

四、数据变化比较原理

1、Vue 2 中的引用类型比较

2、Vue 3 中的引用类型比较

3、字符串比较(基础类型比较)

4、性能影响

5、代码示例

五、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

-------------------------------------------------------------------------------------------------------------------------

--------------------------温柔地对待温柔的人,包容的三观就是最大的温柔。--------------------------

-------------------------------------------------------------------------------------------------------------------------

直击Vue2/3watch的底层逻辑,字符串长度对侦听效率的影响

        在Vue 2 和 Vue 3 中,watch 实现的底层原理有一些不同,但它们都基于 Vue 的响应式系统。

一、Vue 2的底层原理

        在 Vue 2 中,响应式系统使用的是基于 Object.defineProperty 的实现。这种方式的 watch 主要通过以下步骤实现:

  1. 初始化时拦截属性:Vue 在初始化数据对象时,会递归遍历数据对象的每一个属性,并使用Object.defineProperty 拦截属性的访问和赋值操作。
  2. 依赖收集:当访问某个属性时,会将当前的 watcher(观察者)记录为该属性的依赖。在赋值时,会触发依赖的更新。
  3. 触发更新:当属性的值发生变化时,会通知相关的 watcher,并调用它们的回调函数。

二、Vue 3的底层原理

        在 Vue 3 中,响应式系统进行了重写,采用了基于 Proxy 的实现。这种方式的 watch 主要通过以下步骤实现:

  1. 使用 Proxy 拦截:Vue 3 使用 Proxy 来拦截对数据对象的访问和修改操作。Proxy 可以直接拦截对对象的操作,而不需要递归遍历每个属性。
  2. 依赖收集和触发更新:与 Vue 2 类似,当访问某个属性时,会进行依赖收集。当属性值变化时,会通知相关的 watcher,并调用它们的回调函数。

三、基础类型性能消耗

        由于 watch 对字符串的处理是将其作为一个整体来对待,因此字符串的长度对性能的影响主要体现在两个方面:

  1. 值比较:在某些情况下,Vue 需要比较新旧值以确定是否发生变化。对于长字符串,这种比较操作可能会稍微增加性能消耗。
  2. 内存占用:长字符串在内存中的占用会更多,可能会增加垃圾回收的开销。

        然而,实际应用中,这种性能差异通常是可以忽略的(这是一个O(1) 复杂度的运算),除非在非常频繁的字符串变化场景下,字符串长度非常大(例如数百万字符)。

四、数据变化比较原理

1、Vue 2 中的引用类型比较

        在 Vue 2 中,当数据发生变化时,Vue 会将新值与旧值进行比较。比较的过程主要在 watcher 内部完成。

  • 浅比较:默认情况下,Vue 进行浅比较,即仅比较对象或数组的引用是否发生变化。这种方式效率较高,但对于嵌套对象或数组的深层变化无法检测到。

  • 深比较:如果 watch 选项设置了 deep: true,Vue 会进行深度递归比较。这样可以检测到嵌套对象或数组内部的变化,但会增加性能开销。

2、Vue 3 中的引用类型比较

        在 Vue 3 中,响应式系统经过了重构,基于 Proxy 的实现使得值比较的过程有所简化和优化。

  • 浅比较:与 Vue 2 类似,默认情况下进行浅比较,只检测对象或数组的引用变化。

  • 深比较:如果 watch 选项设置了 deep:true,Vue 3 也会进行深度递归比较,检测嵌套对象或数组的内部变化。

3、字符串比较(基础类型比较)

        对于字符串类型的数据,Vue 的值比较相对简单,因为字符串是基本数据类型,可以直接进行值比较。

  • 引用比较:对于基本数据类型(如字符串、数字、布尔值等),Vue 直接比较它们的值。这种比较是 O(1) 的操作,因此对于字符串长度不敏感。

  • 深比较:不适用于基本数据类型,因为字符串是不可变的值类型,不涉及对象的嵌套结构。

4、性能影响

  1. 浅比较性能:浅比较效率很高,因为它只比较引用或值。字符串的长度对浅比较性能没有影响。

  2. 深比较性能:深比较涉及递归检查对象的每一个属性和嵌套结构,对于复杂的嵌套对象会有一定的性能开销。对于字符串,不会进行深度比较,因此字符串长度对深比较也没有影响。

5、代码示例

以下是 Vue 3 中一个简单的 watch 示例,演示如何比较字符串:

import { reactive, watch } from 'vue';const state = reactive({message: 'Hello, Vue 3!'
});watch(() => state.message, (newVal, oldVal) => {console.log('Message changed from', oldVal, 'to', newVal);
});// 修改字符串,触发 watch 回调
state.message = 'Hello, World!';

        在上述代码中,当 state.message 变化时,watch 回调会被触发,并且会输出新旧值。对于字符串类型,Vue 会直接比较新旧值,确定是否发生变化。

五、总结

        Vue 中的 watch 实现会在数据变化时进行值比较。对于字符串,比较过程是简单高效的值比较,而不会受字符串长度影响。除非在非常特殊的场景下频繁处理超长字符串,否则性能差异可以忽略不计。

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        更多优质内容,请关注:

        分片上传技术全解析:原理、优势与应用(含简单实现源码)

        浏览器渲染揭秘:从加载到显示的全过程

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        shpfile转GeoJSON且控制转化精度;如何获取GeoJSON?GeoJson结构详解

        通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式等

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        Mapbox添加行政区矢量图层、分级设色图层、自定义鼠标悬浮框、添加天地图底图等

        管理数据必备!侦听器watch用法详解

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM——体系结构

计算机体系结构:冯诺伊曼 哈佛 冯诺依曼结构 冯诺依曼结构,也称冯诺依曼模型或普林斯顿结构,是根据冯诺依曼提出的存储程序概念设计的计算机体系结构。其主要特点包括: 存储程序:指令与数据都…

解决手机按键失灵!全新检测方案了解一下!

手机按键在手机设备中起着至关重要的作用,手机按键用于执行各种操作,如接听电话、挂断电话、调节音量、开关机等,方便用户进行基本操作。在生产过程中视觉检测需要确保按键的尺寸、形状和表面光滑度符合设计要求,以保证按键的正常…

基于Spring Boot的企业产品档案管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页:百成Java 往期系列:Spring Boot、SSM、JavaWeb、python、小程序 前言 随着企业规模扩张和产品种类增多,手动管理方式不再适应不断增长的需求。因此,本研究的目标是设计和开发…

Cesium 缓冲区分析和查询

Cesium 缓冲区分析和查询 loadLabel() {this.collection new Cesium.BillboardCollection()this.viewer.scene.primitives.add(this.collection);this.points [];return new Promise((resolve,reject)>{fetch("../../public/json/hfty-point.json").then(res &g…

设计模式-标识域(Identity Field)

目的 为了在内存对象和数据库行之间维护标识而在对象内保存的一个数据库标识域。 关系数据库和内存对象的区别 区分行:关系数据库使用键来区分数据行,而内存对象不需要这样一个键 引用方法:对象系统中通过原始内存位置直接区分对象&#x…

【资源】wordpress 子比主题

简介 子比主题是一款功能强大的WordPress主题模板,支持社区论坛、商城、支付、古腾堡编辑器等多种功能。很多资源类网站都是基于此搭建的。搭建后的效果基本上和官网一致,可查看官网的演示效果。 官方网站:https://www.zibll.com/ 如要获取…

安装MySQL数据库【后端 8】

安装MySQL数据库 MySQL是世界上最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于Web应用程序开发中。无论你是初学者还是有一定经验的开发者,掌握MySQL的安装都是必不可少的技能。本文将指导你如何在不同的操作系统上安装…

Elasticsearch:使用 ES|QL 进行地理空间搜索

作者:来自 Elastic Craig Taverner 多年来,Elasticsearch 一直具有强大的地理空间搜索和分析功能,但其 API 与典型的 GIS 用户习惯的 API 截然不同。在过去的一年中,我们添加了 ES|QL 查询语言,这是一种管道查询语言&a…

MapReduce_Writable序列化

使用序列化封装对象 将输入的csv按照员工号拆分成每个员工&#xff0c;每个员工存储为员工对象 数据处理过程 employee_noheader.csv 1,ZhangSan,101,5000 2,LiSi,102,6000 3,WangWu,101,5500 4,ZhaoLiu,103,7000 5,SunQi,102,6500pom.xml <?xml version"1.0&qu…

【大模型系列】更像人类行为的爬虫框架

随着大规模模型技术的兴起&#xff0c;我们可以看到百模大战、各种智能体、百花齐放的应用场景&#xff0c;那么作为一名前端开发者&#xff0c;以前端的视角&#xff0c;我们应当如何积极做好技术储备&#xff0c;开拓技术视野&#xff0c;在智能体时代保持一定的竞争力呢&…

ElasticSearch聚合操作详解

文章目录 聚合操作聚合的分类测试数据Metric AggregationBucket Aggregation获取job的分类信息限定聚合范围Range & Histogram聚合聚合嵌套 Pipeline Aggregation聚合的作用范围排序ES聚合分析不精准原因分析聚合性能优化启用 eager global ordinals 提升高基数聚合性能插入…

打造高效信息发布平台小程序:设计思路与实践

在当今这个信息爆炸的时代&#xff0c;信息发布平台已成为连接用户与内容的桥梁&#xff0c;小程序以其独特的优势成为众多企业和个人开发者青睐的选择。开发一款专注于信息发布与共享的小程序&#xff0c;旨在为用户打造一个便捷、高效、互动性强的信息获取平台&#xff0c;具…

luckyexcel 编辑预览excel文件

luckyexcel 编辑预览excel文件 支持后端传文件流预览编辑&#xff0c;也支持选择本地文件编辑预览 看效果 上代码 <template><div style"margin: 30px"><div class"button-box2"><div><div style"color: red">…

Windows File Recovery卡在99%怎么解决?实用指南!

为什么会出现“Windows File Recovery卡在99%”的问题&#xff1f; Windows File Recovery&#xff08;Windows文件恢复&#xff09;是微软设计的命令行应用程序。它可以帮助用户从健康/损坏/格式化的存储设备中恢复已删除/丢失的文件。 通过输入相关命令&#xff0c;设置源/…

整理 酷炫 Flutter 开源UI框架 按钮

flutter_percent_indicator Flutter 百分比指示器库 项目地址&#xff1a;https://github.com/diegoveloper/flutter_percent_indicator 项目Demo&#xff1a;https://download.csdn.net/download/qq_36040764/89631340

jenkins 安装以及自动构建maven项目并且运行

在这里找到你对应jdk的版本的jenkins包 War Jenkins Packages 我这里用的使java8,所以下载 https://mirrors.jenkins.io/war-stable/2.60.1/jenkins.war 然后jenkins可以安装到centos系统 在本地windows系统运行命令行 scp C:\Users\98090\Downloads\jenkins.war root@192…

模拟三层--控制层、业务层和数据访问层

三层的概念:https://developer.aliyun.com/article/1390024 一、新建一个项目 我新建好的项目名为spring__ioc_02,然后在 src-main-java 下建立三层&#xff08;数据访问层、业务层和控制层&#xff09;的包 dao、service 和controller、并在包下建立相应的接口和实现类 Proje…

【2】初识JVM

目录 一.什么是JVM 二.JVM的功能 2.1即时编译 三.常见的JVM​编辑 ​编辑 总结​编辑 一.什么是JVM 二.JVM的功能 2.1即时编译 三.常见的JVM 总结

基于Java中的SSM框架实现高校就业管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校就业管理系统演示 摘要 本论文主要讲述了基于SSM框架及MySQL数据库实现的就业管理系统的设计和开发过程。本论文中所讲的就业管理系统是通过所学的知识创办一个非商业性的网站平台&#xff0c;使所有想要就业信息查看的高校毕业生们与想要宣传自己…

Spring Web MVC入门(中)

1. 请求 访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要 是学习如何传递参数到后端以及后端如何接收. 传递参数, 咱们主要是使⽤浏览器和Postman来模拟&#xff1b; 1.1 传递单个参数 接收单个参数&#xff0c;在Spring MV…