虚拟DOM和DOM diff

140 阅读2分钟

1. 虚拟DOM是什么

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

2. 虚拟DOM的优点

  1. 能减少不必要的DOM操作。虚拟DOM可以将多次操作合并为一次操作,如果正常添加1000个节点,这时是一个一个操作的。
  2. 能跨平台渲染。虚拟DOM的本质是一个JS对象,他不仅可以变成DOM,还可以变成小程序等。

3. 虚拟DOM的缺点

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

4. DOM diff是什么

虚拟DOM的对比算法,diff 算法仅在两个树的同级的虚拟节点之间做比较,递归地进行比较,最终实现整个 DOM 树的更新。

diff 算法主要包括几个步骤:

  • 用 JS 对象的方式来表示 DOM 树的结构,然后根据这个对象构建出真实的 DOM 树,插到文档中。
  • 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树的差异
  • 最后把所记录的差异应用到所构建的真正的DOM树上,视图更新

5. DOM diff的优缺点

使用 DOM diff,我们可以只更新发生了改变的节点,而不必每次更新所有的节点。但是它也存在他的问题,在同级节点中对比会有一些 bug,由于计算机总是会从左到右计算,假设现在有三个同级节点,当我们删除了第二个节点后,在 DOM diff 算法中,其实并不是认为删除了第二个节点,而是认为原本的第二个节点发生了改变,变成了第三个节点的内容,而第三个节点则被认为是删除了。为了解决这个问题,可以给每一个节点加上唯一属性id来作为Key,来表示各个节点,这样计算机就知道你要删除的是第二个节点,而不会舍近求远。

建议: 不要使用index作为key,会产生上面说的问题,你可以使用唯一id来作为key,这个id可以通过:创建一个 id() 函数,每次调用自增一;或者使用 guid 库或者 uuid() 库;最好使用数据库中的 id。这三种方式获得。