便于了解 Virtual Dom 原理的简单实现。
Virtual Dom 算法的实现主要是以下三步:
- 树的递归:
- 没有新的节点,那么什么都不用做
- 新的节点的 tagName 和 key(可能都没有)和旧的相同,开始遍历子树
- 新的节点的 tagName 和 key 和旧的不同,就替换节点
- 判断属性的更改:
- 遍历 oldProps 查看是否有属性值被删除
- 遍历 newProps 查看是否有属性值被修改
- 在第二步中同时查看是否有属性新增
- 遍历子树:
- 判断新旧子树差异
- 给节点打上标记
- 判断子树的差异:
- 遍历旧的节点列表,查看每个节点是否还存在于新的节点列表中
- 遍历新的节点列表,判断是否有新的节点
- 在第二步中同时判断节点是否有移动
- 部分改变多个节点构成的同级组合时,使用 v-if 而不是 template;
- 确保 key 为节点的唯一值。
- 在不需要手动优化的情况下,使框架能提供过得去的性能;
- 虽然在所有数据都变了的情况下,重置 innerHTML 其实是一个合理的操作,但局部更新 VD 的消费更小;
- 因为 key 的存在,DOM 元素可以复用。
by 尤大: VD 真正的价值从来都不是性能,而是:
- 为函数式的 UI 编程方式打开了大门;
- 可以渲染到 DOM 以外的 backend,比如 ReactNative。
https://www.zhihu.com/question/31809713/answer/53544875
https://github.com/KieSun/My-wheels/tree/master/Virtual%20Dom