直击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 示例,演示如何比较字符串:

javascript">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.ppmy.cn/server/99302.html

相关文章

qt-05停靠窗口QDockWidget

停靠窗口QDockWidget mainwindow.cpp二级目录三级目录 mainwindow.cpp #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {setWindowTitle(QObject::tr("DOckwindows"));QTextEdit *te new QTextEdit(this);//定义…

[Qt][QWidget]详细讲解

目录 1.概述2.QWidget核心属性1.简介2.核心属性概览 3.QWidget常用属性1.enabled2.geometry1.是什么?2.Window Frame的影响3.相关API4.注意 3.windowTitile4.windowIcon5.windowOpacity6.cursor8.font9.toolTip10.focusPolicy11.styleSheet 1.概述 Widget是Qt中的核…

SpringBoot加载dll文件示例

1、将动态库放在resource文件目录下 2、编写相关加载逻辑 import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.util.HashMap;/*** Description: 加载动态库 .dll文件* author: Be.insighted* c…

Maven学习笔记

Maven 一、Maven简介 1. 什么是Maven ​ maven [ˈmeɪvn] 专家、内行 ​ Apache Maven 是一个软件项目管理和构建工具,可以帮助创建和管理项目 ​ 基于项目对象模型(POM:Project Object Model)的概念,帮助开发者…

AI智能名片小程序源码在付费媒体与企业营销策略中的创新应用

摘要:在数字化浪潮的推动下,付费媒体已成为企业营销战略的核心组成部分。从视频流媒体平台到社交媒体,企业需不断探索新颖且高效的营销手段以吸引目标受众并促进业务增长。AI智能名片小程序源码,作为融合人工智能、小程序技术与传…

git配置忽略文件后未生效

git在.gitignore文件配置 忽略文件后提交未生效 一、确保 .gitignore 文件中包含正确的规则: 忽略文件夹和文件 unpackage/ unpackage/cache/ unpackage/cache/wgt/ unpackage/dist/ 二、Git 缓存可能会导致忽略规则没有即时生效。可以使用以下命令清理缓存 gi…

Flutter 学习 一部分注意点记录

使用AndroidStudio进行开发 假设你已经配置好Flutter和dart的SDK. 创建一个可执行dart文件 如果需要直接新建一个dart文件来运行,可以点击 File->New->New Flutter Project ,下面是接下来弹出的新建项目弹窗,选中左边的Dart&#xff…

代码随想录算法训练营第十三天(二)|二叉树的层序遍历

层序遍历是一种广度优先搜索(BFS)的遍历方式,它按照从上到下、从左到右的顺序访问二叉树的所有节点。我们可以使用队列来实现层序遍历。 具体步骤如下: 创建一个空队列,将根节点入队。当队列不为空时,执行…

前端黑科技:使用 JavaScript 实现网页扫码功能

在数字化时代,二维码已经渗透到我们生活的方方面面。从移动支付到产品溯源,二维码凭借其便捷性和高效性,成为了信息传递的重要载体。而随着前端技术的不断发展,我们甚至可以使用 JavaScript 在网页端实现二维码扫描功能&#xff0…

C++之类与对象(中)(上篇)

类与对象(中) 类的默认成员函数 默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4…

详解贪心算法

贪心算法(Greedy Algorithm) 概述: 贪心算法是一种在求解最优化问题时采取的一种常用算法策略。贪心算法的基本思想是,每次选择当前情况下的局部最优解,并相信这个局部最优解能够导致全局最优解。贪心算法通过迭代的方式一步步地…

VSCode中的资源管理器没有NPM脚本,如何解决

一、没有NPM脚本 在前端项目中,发现VSCode中的资源管理器一栏里面没有NPM脚本选项,如何解决? 二、解决方法 1.方法一 点击上方终端->新建终端,之后点击资源管理器右边的三个点就有npm脚本了 2.方法二 在资源管理器右侧&am…

Elasticsearch 搜索高亮功能及示例

在全文搜索中,高亮显示搜索关键字是一种常见的需求,它可以帮助用户快速定位到搜索词在文本中的位置。Elasticsearch 提供了强大的高亮功能,允许我们在搜索结果中突出显示匹配的文本片段。 高亮原理 Elasticsearch 的高亮功能通过在搜索结果…

html语法

HTML5 和 CSS3新功能 概述 HTML5 和 CSS3 是 Web 开发领域中的两个重要标准,它们带来了许多新功能和改进,使得开发者能够创建更加丰富和交互式的网页应用。以下是这两个标准的一些重要特性和示例。 HTML5 1. 新的语义化标签 特性描述 HTML5 引入了…

Dom 元素转换 Image 图片 (截图)

Dom 元素转换 Image 图片 (截图) dom-to-image dom-to-image NPM 官网文档 参考文章码上行舟 dom-to-image 是如何将 html 转换成图片的(文章参考) 安装 npm install dom-to-image --save 使用 /* in ES 6 */ import domtoimage from "dom-to-image"; /* in ES 5 *…

Android进阶之路 - app后台切回前台触发超时保护退出登录

我们经常会在银行、金融或者其他行业的app中看到用户长时间将app放置于后台,当再次唤醒app时就会提示用户已退出登录,需要重新登录,那么该篇主要就是用于处理这种场景的 针对于放置后台的超时保护属于进程级别,所以我们需要监听进…

WebGoC题解(17) 177.(佛山图书馆GoC决赛试题 )第5题 同心圆(cir)

题目描述 小Pen上数学辅导课,内容是等差数列,就是一系列数,每相邻的2项之间的差都相等(后项-前项)。 比如下面三个数列都是等差数列: 1 2 3 4 5 6….; 10 13 16 19 22….; 100 95 90…

redis发布订阅注意事项

redis发布订阅注意事项 文章目录 redis发布订阅注意事项前言一、报错现场还原二、代码修正 前言 Redis 的发布/订阅(Pub/Sub)是一个消息传递模式,主要有发布端和订阅端两个角色,发送者(pub)发送消息,订阅者(sub)接收消…

JS-13.对象-DOM-案例

通过DOM操作&#xff0c;完成如下效果实现 1.点亮灯泡 2.将所有的div标签的标签体内容后面加上&#xff1a;very good(红色) 3.使所有的复选框呈现被选中的状态 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

Windows图形界面(GUI)-MFC-C/C++ - 列表视图(List Control) - CListCtrl

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 列表视图(List Control) - CListCtrl 创建列表视图 设置列表视图属性 成员函数 注意事项 示例代码 列表视图(List Control) - CListCtrl 创建列表视图 在对话框编辑器中&#xff…