先说结论:
相同点:
1、都是通过两组虚拟DOM的对比,根据差异进行更新
2、react和vue只对比同级节点,忽略跨级比较
3、都是用key作为唯一标识,进行查找
4、遍历前都会根据老节点构建map,方便根据key快速查找
不同点
1、虽然react和vue都是只对比同级节点;但如果className不同,即使节点元素相同vue也认为是不同类型的元素,会选择删除构建;而react则仍认为是相同节点,只是修改节点的属性
2、vue是双指针模式,采用双端对比,从两端到中间对比的方式;而react由于是单指针Fiber单链表模式,从左到右依次对比
什么是diff算法
diff算法是一种对比算法,对比的对象是新旧的虚拟DOM,通过找到新旧虚拟DOM之间的差异来更新真实DOM
虚拟DOM:用来描述真实DOM的js对象,虚拟DOM是解决频繁操作真实DOM影响性能的一种解决方案;通过提供一种简单的对象去替代负责的DOM对象结构,从而优化DOM操作
传统的的diff算法是通过递归深度遍历虚拟DOM,而且不分层级;所react和vue进行了仅同级比较等优化
番外篇:vue2和vue3 diff算法的差异
1、虚拟DOM优化:vue2 diff算法是针对整个虚拟DOM树进行完整的比较;而vue3则是通过静态分析和标记,将组件标记为静态组件、动态组件;当更新DOM是,静态组件会直接复用,只对动态节点进行对比更新,从而减少diff对比次数
2、vue2每次更新都会重新设置事件监听器,存在一定的损耗;而vue3通过缓存和重用事件侦听器,从而提高了事件的处理效率