vue2 diff
Vue2的diff算法执行updatevnode比较新旧节点时会优先处理特殊场景,即头头比对,头尾比对,尾头比对等,并借助key值找到可复用的节点进行相关操作,有效减少移动节点的次数。
vue3 diff
vue3中的diff算法中有两个理念,第一个是相同的前置和后置元素的预处理;第二个则是最长递增子序列,此思想又于react
的diff
类似又不尽相同,
前置于后置的预处理
检查新旧vnode
的首尾是否相同,如果相同就可以重复利用, 如果不同就进行第二步,计算最长的递增子序列的统计,即记录新的vnode
节点中的元素的出现在旧的vnode
中的节点索引位置,没有找到的记为-1。
对应的最长的递增子序列可以重复使用,而记为-1的则新增插入到新的位置,新的vnode
中除了记录为-1的和最长递增子序列的之外的,移动到新的序列对应的位置即可,最后没有在新的vnode
中找的, 全部删除即可
react diff
react的diff算法原理是,从左至右查询新的vnode
节点在旧的oldVnode
节点中的索引位置,并做出移位,删除,修改,没有找到的元素,就创建一个在对应的索引位置。
DOM节点的基本类别,以及各自类别基本属性的值及简单介绍
vue和reactdiff算法的区别
react中的diff算法和vue中的diff算法,都是只做同级比较,vue中的diff时调动patch函数,参数是vnode
和oldVnode
分别代表新旧节点
1.vue比对节点,当节点元素类型相同,但是className不同,认为是不同类型元素,删除重建,而react会认为是同类型节点,只是修改节点属性
2.vue的列表比对,采用从两端到中间的比对方式,而react则采用从左到右依次比对的方式。当一个集合,只是把最后一个节点移动到了第一个,react会把前面的节点依次移动,而vue只会把最后一个节点移动到第一个。总体上,vue的对比方式更高效。