虚拟 DOM
虚拟 DOM 和真实的 DOM 相对应,一个能代表 DOM 树的对象,通常含有标签名,标签上的属性,事件监听和子元素们及其他属性。虚拟 DOM 再通过编译器编译成 js 渲染函数的代码,从而实现简将虚拟 DOM 转化为html 代码添加到页面当中。
- 优点:总有人说 DOM 操作慢,但是这个操作慢要看是和什么作对比,如果是和原生 js 对比,那么确实是慢的。虚拟 DOM 其实也是基于原生 DOM 再一次进行了封装,所以是不可能比原生 DOM 操作还快的,但是在某些情况下,确实虚拟 DOM 比原生 DOM 操作更加快速
- 将多次操作合并为一次操作,通过 DOM diff 只操作新增的 DOM
- 跨平台渲染:虚拟 DOM 本质是一个对象,可以把它转化为任何我们想要的样子,可以是小程序,ios 应用,安卓应用等
缺点:
Tree diff:
- 将新旧两棵树进行逐层对比,找出那些节点是需要更新的
- 如果节点是组件就看2
- 如果节点是标签就看3
- Component diff:
- 如果节点是组件,就看组件类型
- 类型不同删除旧的,直接替换
- 类型相同则只更新属性
- 然后深入组件做1
- Element diff:
- 如果节点是原生标签,只看标签名
- 标签名不同直接替换,否则只更新属性
- 然后深入标签做
优点:速度快,效率高
缺点:同级节点对比有 bug
- 解决办法:使用 id 标记节点,不要用 index 标记
