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

news2024/11/13 17:58:53

目录

直击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.coloradmin.cn/o/1996540.html

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

相关文章

数据结构(学习)2024.8.6(顺序表)

今天开始学习数据结构的相关知识,大概分为了解数据结构、算法;学习线性表:顺序表、链表、栈、队列的相关知识和树:二叉树、遍历、创建,查询方法、排序方式等。 目录 一、数据结构 数据 逻辑结构 1.线性结构 2.树…

土压力计的基本工作原理:振弦式土压力计的奥秘

在土木工程、地质勘探及地下结构工程中,土压力计作为一种重要的监测设备,扮演着至关重要的角色。它能够实时、准确地测量土体内部的压力变化,为工程的安全性和稳定性提供可靠的数据支持。其中,振弦式土压力计以其高精度、稳定性好…

20-导线及NetLabel的添加

1.放置电气导线:ctrlw 2.放置网络标签

FCBFormer复现

表1 Kvasir-SEG复现结果:mDice:0.93846,mIoU:0.890299,mPrec.:0.945872,mRec.:0.940086 CVC-ClinicDB复现结果:mDice:0.946874,mIoU:0…

【Math.NET】使用Fit.Polynomial多项式拟合(直线、抛物线)的示例代码与示意图

介绍 Math.NET是一个开源项目:https://www.mathdotnet.com/,旨在构建和维护涵盖基础数学的工具箱,以满足 .NET开发人员的高级需求和日常需求。 关于Math.NET用法的参考博客: https://www.cnblogs.com/dino623/p/curve_fitting_a…

Canvas-Editor 基于canvas/svg的富文本编辑器

前言 哎,最近逛论坛,看的文章,真是水的一批,且不说水平咋样,有些结论、方法都是错的,不符合前端模块化、工程化规范,自己写写demo,觉得成功了,恨不得马上分享写博客&…

我的JavaScript异常监控策略:保护前端应用免受错误的困扰!

在上一篇文章如何及时发现网页的隐形错误中我们讲了,前端有哪些常见的异常,以及如今监控获取这些异常的方法,今天我们就来讲讲我是如何来监控我的JavaScript异常的。 背景 浏览器侧的异常分为两种类型 JavaScript 错误,一般来自…

为什么在网页编辑文字时键盘输入换行要停顿一下 网页才显示

事情的起因: 不知道从什么时候开始,在浏览器上编辑文字时,换行操作总是延迟响应,但点击空格网页响应速度正常。时间长了也习惯了,可能觉得本来就是这样吧,网页编辑可能不稳定,加上自己使用的是蓝…

结构体structure、共用体union

结构体 结构体类型——用来描述复杂数据的一种数据类型 构造类型(用户自定义类型) struct 结构体类型名 { 成员列表; }; struct关键字:表明是在构造一个结构体的类型 结构体名:用来描述结构体这个类型的一个名称 成员列表&…

JavaWeb系列十一: Web 开发会话技术Session

Web 开发会话技术Session Session有什么用session基本原理session原理示意图session可以做什么如何理解Session Session常用方法Session底层实现机制原理分析图应用实例session实现原理动画 Session生命周期Session生命周期说明Session生命周期实例 作业布置 Session有什么用 …

8.9 C++

1.思维导图 2. 搭建一个货币的场景,创建一个名为 RMB 的类,该类具有整型私有成员变量 yuan(元)、jiao(角)和 fen(分),并且具有以下功能: (1)重载算术运算符…

书生大模型实战营第三期_L2-LMDeploy 量化部署进阶实践(81班1101作业)

大模型的痛点 大模型的计算量是非常大的 2. 显存的相应区域是非常大的 3.访存瓶颈 GPU的大部分时间都花在数据交换上面不断拉高batchsize,不断地提高计算的访存比是不是会有较好的效果呢?这是一个很好的想法,但是显存不够就会很尴尬为了能…

【youcans动手学模型】YOLO5 实战(中)训练目标检测模型

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans YOLO5 实战 (上)环境配置与测试 【youcans动手学模型】YOLO5 实战(中)使用自己的数据集训练目标检测模型 1. 准备训练数据集1.1 开源数据集1.2 YOLOv5 …

k8s1.18.0完整部署教程

k8s的官网地址:https://kubernetes.io/docs Kubernetes 也称为 K8s,是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。 K8s通过各种资源对象来管理pod相关的功能,借助pod本身的功能实现大规模容器应用的自动化管理&…

享界S9+问界M9,华为智选车的高端局

作者 |老缅 编辑 |德新 8月6日,鸿蒙智行在北京发布D级纯电旗舰轿车,也是北汽 - 华为智选车合作的第一款车型,享界S9。 享界S9搭载了包括华为乾崑ADS 3.0在内的多项首发技术,全系标配100kWh华为800V巨鲸电池。 而在价格上&#…

mysql⑥:约束

一,概念 例子: 外键约束 例子: 外键的删除和更新

从商业角度分析,充电桩还能赚钱吗?

一、投入与产出 1、投入 是建设成本,包括设备(箱变、充电设备、电缆等)、土建和配套(雨棚、照明、监控等)。二是运营成本,包括租金、人工、电损等。 2、产出 充电手续费以及增值服务(停车费…

力扣高频SQL 50题(基础版)第三十八题之1484.按日期分组销售产品

文章目录 力扣高频SQL 50题(基础版)第三十八题1484.按日期分组销售产品题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题(基础版)第三十八题 1484.按日期分组销售产品 题目说明 表 Activities: ---…

shell的条件测试

为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所…

算法训练.

一.扩散 题解&#xff1a; 计算点之间的距离&#xff0c;然后对图进行处理即可&#xff0c;这个数据规模较小&#xff0c;因此我使用了floyd,还有最小生成树和二份答案加并查集的写法&#xff1b; 代码&#xff1a; #include <iostream> #include <cstring> #in…