DOM和DOM diff

79 阅读2分钟

虚拟DOM

虚拟DOM是什么

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

为什么虚拟DOM比真实DOM快

  1. 减少DOM操作
  • 虚拟DOM可以多次操作合并为一次操作,如你添加1000个节点,却是一个接一个操作的。
  • 虚拟DOM借助DOM diff可以把多余的操作省掉,如你添加1000个节点,实际上只有十个是新增的。
  1. 跨平台 虚拟DOM不仅可以变成DOM,还可以变成小程序,IOS应用,安卓应用,因为虚拟DOM本质上是一个JS对象。

虚拟DOM的优缺点

优点

虚拟DOM比真实DOM快的两点

缺点

需要额外的创建函数,如createElement或h,但可以通过JSX来简化成XMl写法(严重依赖打包工具)。

规模较小时,使用DOM比虚拟DOM快,规模较大时虚拟DOM的计算会速度变慢

DOM diff(虚拟DOM的对比算法)

是什么?

  • 一个函数,称之为patch
  • patches = patch(oldVNode,newVnode)
  • patches就是要运行的DOM操作

大概逻辑

Tree diff

  1. 将新旧两棵树组逐层对比,找出哪些阶段需要更新
  2. 如果节点是组件就看Component diff
  3. 如果节点时标签就看Element diff

Component diff

  1. 如果节点是组建,就看组件类型
  2. 类型不同直接替换(删除旧的)
  3. 类型相同则只更新属性
  4. 然后深入组件做Tree diff

Element diff

  1. 如果节点时原生标签,则看标签名
  2. 标签名不同直接替换,相同则值更新属性
  3. 然后进入标签后代做Tree diff

虚拟DOM的bug