首页 > 技术文章 > 了解vue虚拟DOM和diff算法

liandudu 2021-03-29 15:26 原文

虽然很粗俗不高大上,但是应该很容易懂啊哈哈~

 

什么是虚拟dom?

虚拟Dom是一个js对象,它保存了生成真实dom的一些属性。可以理解成是dom树的js描述或者js版本的dom元素。如果直接操作dom,开销是很大的。虚拟dom的问世,让我们可以直接操作js,将它替换渲染成真实dom。毕竟才做js的成本远小于操作真实dom。所以像vue、react这种框架都采用了虚拟dom来更新视图,内部封装diff算法。将虚拟dom发扬光大,奥里给~

 

vue中虚拟dom的生成过程?

vue中通过模板描述状态与视图之间的映射关系,它会先将模板编译成渲染函数,执行渲染函数生成虚拟dom,使用虚拟dom生成真实dom元素,插入页面渲染视图

 

vue中的虚拟dom和有哪些类型?

在Vue.js 中虚拟 DOM 的 JavaScript 对象就是 VNode。

vnode有很多种不同的类型,

(1)注释节点

(2)文本节点

(3)元素节点

(4)组件节点

(5)函数式节点

(6)克隆节点

 

什么是新旧虚拟dom?

因为每次渲染视图都要先创建vnode, 然后使用它创建真实dom插入到页面中。所以将上一次渲染视图时创建的vnode缓存起来,这个缓存的vnode就是oldVnode。

新创建的,需要被渲染的vnode就是newVnode

 

什么是patch算法(diff算法,vue中叫patch)?

比较新旧两个vnode之间有哪些不同,根据对比结果找出实际需要更新的节点进行更新,最终渲染成真实dom。

patch的过程:创建节点、删除节点、修改节点

注意:比较只是patch的一部分,它最终的目的是渲染新视图(更改数据后的视图)

 

为什么需要patch算法?

极大的减少dom操作,提升性能!

想想一下,如果没有diff算法,那我们改变数据时就需要将整个dom结构全都删除并且重新渲染。明明只改变了一个文本,点击了一下按钮(比如异步操作),却要整个页面刷新重新渲染?那代价也太大了,不会被喷死才怪嘞。

 

暂存~

 

 

 

 

 

 

 

推荐阅读