类别:vue / 日期:2023-02-25 / 浏览:290 / 评论:0
简单来说,diffff算法有以下过程
- 同级⽐较,再⽐较⼦节点
- 先判断⼀⽅有⼦节点⼀⽅没有⼦节点的情况(如果新的children没有⼦节点,将旧的⼦节点移除)
- ⽐较都有⼦节点的情况(核⼼diffff)
- 递归⽐较⼦节点
正常Diffff两个树的时间复杂度是 O(n^3) ,但实际情况下我们很少会进⾏ 跨层级的移动DOM ,所以Vue将Diff进⾏了优化,从 O(n^3) -> O(n) ,只有当新旧children都为多个⼦节点时才需要⽤核⼼的Diffff算法进⾏同层级⽐较。
Vue2的核⼼Diffff算法采⽤了 双端⽐较 的算法,同时从新旧children的两端开始进⾏⽐较,借助key值找到可复⽤的节点,再进⾏相关操作。相⽐React的Diffff算法,同样情况下可以减少移动节点次数,减少不必要的性能损耗,更加的优雅。
Vue3.x借鉴了 ivi算法和 inferno算法
在创建VNode时就确定其类型,以及在 mount/patch 的过程中采⽤ 位运算 来判断⼀个VNode的类型,在这个基础之上再配合核⼼的Diffff算法,使得性能上较Vue2.x有了提升。(实际的实现可以结合Vue3.x源码看。)
版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。
发表评论 / 取消回复