-
虚拟dom 其实就是用js对象来模拟dom
- 为什么要有虚拟dom
主要是为了解决浏览器性能问题
其实就是将多次对dom的更新操作放在虚拟dom(其实就是内存中的js对象)上,最后,所有更新完成后,一次应用在真正的dom树上。 这样就减少了对dom的操作次数。
更重要的意义
虚拟dom其实也是为了实现跨平台、服务端渲染,提供一个更合理的dom更新策略 虚拟dom对于mvvm框架更加有生命力
-
diff算法
- 为什么要有diff算法 主要还是为了为了避免或者减少多次操作dom,提升效率
diff算法作用就是找到dom要更新的部分
diff算法就是对比更新前后的虚拟dom,将更新的部分记录下来,先将所有变化都反映在虚拟的dom中,然后最终应用于真实的dom节点中,进行浏览器dom的一次更新。
diff算法只是为了虚拟dom比较更加高效
更新dom树之后,会对比新旧dom树,对比的算法就是diff算法,对比会出现四种情况,得出四种结果数据表,最后将结果数据表通过dom fragment更新到浏览器dom中。
- 四种情况:
- 节点类型变化:
- 直接卸载旧结点,装载新节点,如p变成h
- 节点类型不变,属性或属性值发生变化
- 更新属性,如改变class值
- 文本变化
- 直接修改文本内容
- 移动/增加/删除 子节点
- 每个节点的唯一标识进行区分,尤其是插入的时候,不需要将插入位置后的所有节点都进行移动
- 节点类型变化:
- 三个策略
- tree diff
- component diff
- element diff
- tree tiff 就是对更新后的新树和之前的旧树进行逐层遍历,从而进行比较
-
其他两种没看懂,估计也记不住
- 补充知识:
-
DocumentFragment
接口表示一个没有父级文件的最小文档对象。它被当做一个轻量版的Document使用,用于存储已排好版的或尚未打理好格式XML片段。最大的区别是因为DocumentFragment不是真实DOM树的一部分, #### 它的变化不会引起DOM树的重新渲染的操作(reflow),且不会导致性能等问题