虚拟 DOM 和 DOM diff

112 阅读2分钟

一、虚拟 DOM 是什么?

一个能代表DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其他属性。

二、虚拟 DOM有什么优点?

1、能减少不必要的DOM操作(两个例子)

2、能跨平台渲染

三、虚拟 DOM有什么缺点?

需要额外的创建函数,如createElement 或 h ,但可以通过JSX来简化成XML写法。

四、DOM diff 是什么(diff对比)

虚拟DOM的对比算法

1、DOM diff就是一个函数,称之为patch

patches = patch(oldVNode, newVNode)

patches 就是要运行的DOM操作。

2、DOM diff 可能的大概逻辑

  • Tree diff 把虚拟DOM想象成DOM树,将新旧两颗树逐层对比,找出哪些节点需要更新。

如果节点是组件就看Component diff

如果节点是标签就看Element diff

  • Component diff 如果节点是组件,就先看组件类型

类型不同直接替换(删除旧的)

类型相同则只更新属性

然后深入组件做Tree diff(递归)

  • Element diff

如果节点是原生标签,则看标签名

标签名不同直接替换,相同则只更新属性

然后进入标签后代 做 Tree diff(递归)

一个页面的节点大概2000-10000个

五、DOM diff 的优点

DOM diff其实就是一个函数,它会对比 oldNode 与 newNode 的区别。从而减少不必要的渲染。

六、DOM diff 的问题(key)

同级比较存在bug,解决办法是给每个节点一个唯一的id作为 key,让计算机根据这个 key ,知道我们操作的是哪个 DOM 。

深入阅读

React 虚拟 Dom 和 diff 算法 juejin.cn/post/684490…

React 源码剖析系列 - 不可思议的 react diff zhuanlan.zhihu.com/p/20346379

Vue2.0 v-for 中 :key 到底有什么用? www.zhihu.com/question/61…