ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Vue 虚拟DOM和diff算法

2022-02-21 19:32:30  阅读:323  来源: 互联网

标签:Vue DOM vnode Reflect 虚拟 Proxy diff 方法


vue 中

数据改变 -> 虚拟DOM(计算变更)-> 操作DOM -> 视图更新

虚拟DOM: js执行速度比较快

什么是虚拟DOM?

用JS模拟DOM结构

为什么需要虚拟DOM?

vue中 数据驱动视图,需要用高效方法来控制DOM操作的次数

diff算法: 虚拟DOM的核心

patch函数

两个使用场景:

首次渲染时,判断第一个参数是否是一个真实dom元素,是的话就创建空vnode,并且关联一个DOM元素,然后比较patch函数传入的第一个参数和第二个参数是否是同一个vnode,如果是同一个vnode,那么就直接patchVnode做更新,如果是不同的vnode,那么就创建新的DOM元素,插入,并且把老的DOM元素删除。

patchVnode函数:

updateChildren函数:

DOM Diff

对比两个虚拟节点,找出他们的差异,然后对应到真实DOM节点 去打补丁(patch)的过程

目的:以最小的代价来去修改DOM

虚拟节点:将真实DOM用一个对象来表达出来。

defineProperty 和 Proxy的区别:

本质上有不同,所以使用上有所不同。

defineProperty 本质是给对象增加属性用的,所以在修改数组长度,用索引设置数组的值,数组的push(),pop() 是无法触发 defineProperty 中的set 的。所以Vue2中是使用自己定义的一些数组方法来实现的。

Proxy 没有这个缺点。

Vue2 中不使用Proxy的原因是因为proxy是属于ES6,当时考虑的是兼容性的问题。

Reflect 反射 内置对象 方法集合的容器

Reflect 的好处:

之前的好多方法都挂在Object上,就很混乱。

未来很多方法都会逐渐放在Reflect上,成为内置方法的容器,统一管理各种方法。

Reflect.has(obj,‘a’) // 函数式编程。

对比 ‘a’ in obj

Object中的方法有些会直接抛出异常,需要包裹try catch

而Reflect中的方法一般都有返回值,失败后会合理返回。

Proxy 中handler中的方法 和Reflect中的方法是一一对应的。

Reflect 是ES6中全局的内置对象。直接保存的静态方法,不需要实例化,可以直接使用。

标签:Vue,DOM,vnode,Reflect,虚拟,Proxy,diff,方法
来源: https://blog.csdn.net/web19808536489/article/details/123053909

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有