vue的实现八股

双向绑定原理

Vue的双向绑定原理是通过数据劫持观察者模式实现的。

vue使用了响应式的对象,即当数据发生改变的时候,视图也会随之改变

数据劫持

vue2使用了object.definedproperty对数据的每个属性进行劫持,从而逐一对每个属性进行set或者get操作,对于一些动态操作和数组操作需要额外的处理

vue3使用了proxy来绑定整个对象,会拦截对象的每个新增,删除等操作,更加的快捷。

vue会绑定一个watcher对象来监听数据的变化,当数据变化时就会进行相应的视图更新

观察者模式(非父子组件之间的通信才是发布订阅模式,注意区别):

vue中有一个watcher对象,用于观察数据的变化以及收集依赖

当vue双向绑定一个数据时,会创建一个watcher对象,并且将watcher对象收集到相关依赖中,当数据发生改变的时候,就会通知所有watch对象,并随着发生相应的改变

vue2数组响应式是怎么实现的呢

vue2中的由于数据劫持是把对象内的每一个属性进行分别绑定,因此当数组元素新增或者删除时,实际变化的是数组length属性,而并没有对每个属性改变,因此数组无法捕获到变化

vue2数组的响应式是通过劫持数组的方法来实现,例如push,pop,shift,sort,reverse等方法,他们在完成对数组操作的同时,还会发生相应通知给watch对象,实现相关的更新操作。

因此在vue2对数组进行操作的时候,尽量使用数组原生方法来操作,如果使用索引对数组进行改变是无法实现响应式的

this.arr[0] = 'd'; // 直接通过索引修改数组元素
this.arr.length = 2; // 直接修改数组的长度
//无法实现响应式

可以使用Vue的$set方法来修改数组元素

$set是Vue中的一个实例方法,用于在响应式对象上添加响应式属性

渲染的过程

1.模板的编译渲染

2.数据的双向绑定

3.创建虚拟dom:vue会根据模板和数据生成虚拟dom,它可以代替真实的dom进行操 作,并将最终结果反应到真实dom上

4.diff算法更新:通过比较vnode的变化,找出需要改变的地方,实现局部的响应式更新

5.最终的结果反应到真实dom上,并且更新相关的节点,随后完成渲染

diff算法过程

diff算法有两个重要策略:

1.比较属性,先对属性比较,属性不同才会更新,同时对子节点进行递归遍历比较

2.key标识,通过唯一的key标识来比较节点

diff算法本质在于,使用双指针对比新旧dom树,然后对子节点进行递归比较:

1.比较根节点,如果根节点不同,直接替换dom树

2.根节点相同则比较他们的子节点

3.比较key值,如果不同,替换。

4.如果key相同,则比较子节点的属性

5.如果key和子节点的属性都相同,则以此类推继续向下递归遍历

注意!即使key相同,属性也可能因为绑定了新的事件或者样式等发生改变,所以key比较完之后,还要对属性进行比较

浏览器为什么不引入虚拟dom

1.不一定所有的业务场景都需要虚拟dom的局部更新功能,一些简单的操作,直接对真实dom进行操作就可以了

2.虚拟dom虽然可以做到更好的视图更新,但是也会带来额外的开销,虚拟dom的创建的和比较,diff算法,都会有额外的性能开销

3.浏览器之间的兼容性问题,不同的浏览器对浏览器引擎的实现可能有所不同,这可能导致在使用虚拟 DOM 时出现一些兼容性问题

vue3的diff算法优化

1.静态标记:对于一些不会变化的静态文本等元素,vue3可以对他们进行标记,对他们进行跳过,减少diff算法的时间

2.模板的优化:对于一些循环渲染,条件渲染,vue3会对他们没有变化的部分进行标记,下次更新对比的时候就可以直接跳过他们

3.fragment支持:vue2的根节点只能有一个,而vue3可以有多个根节点,可以在diff算法避免一些不需要的更新操作,因为有多个根节点,diff算法可以对多个根节点进行比较更新,而vue2只有一个根节点,需要递归到子节点比较

4.静态提升:在编译阶段就对静态内容进行提前创建,避免渲染过程的重复创建,减少运行开销

真实dom是异步更新

为了减少对真实dom的操作引起回流重绘等问题,通过diff算法对虚拟dom进行比较,并且把每个修改操作推入到微任务队列中,通过异步更新的方式,在下一次事件循环中把这些修改一次性应用到真实dom上

通俗的说,就是vue data中的数据更新时,它不会立即去渲染页面,也就是修改页面中的dom,而是先存储起来,如果一个数据被改了很多次,以最后一次修改为准,这就是所谓的异步更新DOM

异步更新可以保证所有的虚拟dom更新完成之后才会应用到真实dom上,从而减少了对真实dom操作

异步更新还确保了所有的虚拟DOM更新完成后才会应用到真实DOM上。这样可以避免因为数据更新导致的页面抖动或者闪烁等问题。保证修改的同时,整个页面的稳定性和一致性。

$nextTick的触发

每次数据变化都会将相应的DOM更新操作推入到异步更新队列中,这些操作会被放入微任务队列中,随后Vue会执行微任务队列中的回调函数,也就是$nextTick的回调函数。

$nextTick 方法可以确保在下一次DOM更新完成之后执行回调函数。虽然DOM的更新并没有立即应用到真实DOM上,但由于 $nextTick 的回调函数是在微任务中执行的,所以此时已经可以获取到更新后的DOM元素的内容了


以下几种异步操作可能会对DOM进行进一步的改变:

  1. AJAX请求:在进行异步的API请求或数据获取时,可能会根据返回的结果再次修改DOM。
  2. 定时器:使用setTimeout或setInterval等方法设置的定时器,可以在一段时间后对DOM进行修改。
  3. 事件监听器:当触发一些事件时,例如点击事件、滚动事件或键盘事件等,可能会导致DOM的改变。
  4. Vue的生命周期钩子函数:在Vue组件的生命周期中,存在一些钩子函数,例如created、mounted等,在这些钩子函数中,可以对DOM进行进一步的操作

promise为什么能实现nextTick呢

因为promise本质也是一个异步任务,他的回调在微任务队列中,和nextTick的执行一样,本质就是有一个延后性,使得真实dom发生改变后可以获取到当前dom元素,因此使用setTimeout()模拟也是同理

Vue 2.x 中使用 setTimeout() 模拟微任务延迟执行存在一定的延迟性,可能不够精确。

在 Vue 3.x 中,Vue 则采用了原生的 Promise 和 queueMicrotask() 来实现更精确的微任务延迟执行。

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

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

相关文章

00_Linux

文章目录 LinuxLinux操作系统的组成Linux的文件系统Linux操作系统中的文件类型Linux操作系统的组织结构 Linux vs WindowsNAT vs 桥接模式 vs 仅主机Linux Shell命令Linux⽂件与⽬录管理相关指令目录文件普通文件文本编辑 用户管理添加用户删除用户用户组管理 文件权限管理权限…

家庭营销广告Criteo公司首次获得MRC零售媒体测量认证

家庭营销广告Criteo公司首次获得零售媒体测量MRC认证 商业媒体公司Criteo2024年3月28日宣布,它首次获得媒体评级委员会(MRC)的认证,在其企业零售媒体平台commerce Max和commerce Yield上,在桌面、移动网络和移动应用内…

PCL SAC_IA配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…

如何在C++的STL中巧妙运用std::find实现高效查找

如何在C的STL中巧妙运用std::find实现高效查找 一、简介二、在那里吗?2.1、在未排序的元素上2.2、已排序元素 三、在哪里?3.1、在未排序的元素上3.2、已排序元素 四、应该在哪里?五、结论 一、简介 本文章旨在涵盖所有在STL中(甚至稍微超出&#xff0…

Eclipse 配置JDK版本,Eclipse Maven install 时使用的JDK版本

Eclipse配置JDK版本 Eclipse 配置JDK版本的地方? 在Eclipse中配置JDK版本的步骤如下: 打开Eclipse IDE。转到菜单栏并选择 “Window”(窗口)选项。在下拉菜单中选择 “Preferences”(首选项),或…

asp.net core 依赖注入后的服务生命周期

ASP.NET Core 依赖注入(DI)容器支持三种服务的生命周期选项,它们定义了服务实例的创建和销毁的时机。理解这三种生命周期对于设计健壯且高效的应用程序非常重要: 瞬时(Transient): 瞬时服务每次…

大型网站系统架构演化实例_3.使用服务集群改善网站并发处理能力

1.使用服务集群改善网站并发处理能力 使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去更换更强大的服务器,对大型网站而言,不管多么强大的服务器,对大型网站而言&…

算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径

1.什么是回溯算法? 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。其本质是穷举,穷举所有可能,然后选出我们想要的答案。 2.为什么要有回溯算法? 那么既然回溯法并不高效为什么还要用它呢? 因为有的问题能暴力…

第10章 物理安全要求

10.1 站点与设施设计的安全原则 假如没有对物理环境的控制,任何管理的、技术的或逻辑的访问控制技术都无法提供足够的安全性。 如果怀有恶意的人员获取了对设施及设备的物理访问权,那么他们几乎可以为所欲为,包括肆意破坏或窃取、更改数据。…

光伏工程施工前踏勘方案与注意事项

光伏工程是指利用光能发电的技术。随着清洁能源的发展,光伏工程在能源领域的应用越来越广泛。在进行光伏工程施工前,需要对施工现场进行踏勘,以确保施工能够顺利进行并达到预期的效果。 本文游小编带大家一起看一下探勘的方案和注意事项。 1…

设计模式胡咧咧之策略工厂实现导入导出

策略模式(Strategy Pattern) 定义: 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 本质: 分离算法,选择实现 应用场景 何时使用 一个系统有许多类,而区分他们的只是他们直接…

【赛题】2024年“华中杯”数模竞赛赛题发布

2024年"华中杯"数学建模网络挑战赛——正式开赛!!! 赛题已发布,后续无偿分享各题的解题思路、参考文献,帮助大家最快时间,选择最适合是自己的赛题。祝大家都能取得一个好成绩,加油&a…

Python数据可视化:散点图matplotlib.pyplot.scatter()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 Python数据可视化: 散点图 matplotlib.pyplot.scatter() 请问关于以下代码表述错误的选项是? import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 3, 5, 7,…

认识一下RAG

1.RAG技术背景与挑战 2.RAG的核心概念 3.RAG的工作流程与架构 4.RAG的优化方法 RAG的提出 •Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks是一篇重要的论文(2020年5月) •REALM: Retrieval-Augmented Language Model Pre-Training (2020)就将BERT预训练模…

libVLC Ubuntu编译详解

1.简介 有时候,windows上开发不满足项目需求,需要移植到linux上,不得不自行编译libvlc,编译libvlc相对而言稍微麻烦一点。 我使用的操作系统:Ubuntu20.04 查看系统命令lsb_release -a libvlc版本: 3.0.1…

CSS导读 (CSS的三大特性 上)

(大家好,今天我们将继续来学习CSS的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 五、CSS的三大特性 5.1 层叠性 5.2 继承性 5.2.1 行高的继承 5.3 优先级 小练习 五、CSS的三大特性 …

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境2、配置远程连接3、其他配置入口 跑新项目,有个confluent-Kafka-go的依赖在Windows上编译不通过,报错信息: undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持,选择让…

数据库设计的三范式

简单来说就是:原子性、唯一性、独立性 后一范式都是在前一范式已经满足的情况进行附加的内容 第一范式(1NF):原子性 存储的数据应不可再分。 不满足原子性: 满足原子性: 第二范式(2NF&#xf…

历史遗留问题1-Oracle Mysql如何存储数据、索引

在学习到Oracle redo和undo时,涉及到很多存储结构的知识,但是网上的教程都不是很详细,就去复习了一下mysql,感觉是不是开源的问题,Mysql的社区和知识沉淀远高于Oracle, 对于初学者很友好,我想请…
最新文章