传统diff

通过循环递归对节点的依次对比,复杂度是O(n3)

react diff

react对传统diff进行了优化,将复杂度降为O(n)

react基于这几个前提对diff进行了优化:

  • 忽略跨层级操作,因为DOM节点跨层级操作很少。
  • 不同类的组件,则会生成不同的树形结构,相同类的组件,会生成相似的树形结构。
  • 对同一层级的一组子节点,可以通过唯一key进行区分。

1 tree diff

只会对相同层级的DOM节点进行比较,只需要一次遍历,便可以完成整棵树的遍历。如果节点不存在,则该节点及其子节点都会被删掉,对于不同层级的节点,只有创建和删除操作。

2 component diff

  • 针对同类型组件,按照tree diff策略对比。如果开发人员确切知道virtual DOM没有变化,react提供的shouldComponentUpdate()方法可以直接省去tree diff。
  • 针对不同类型组件,则直接判断该组件为dirty component,从而替换整个组件下的所有子节点。

3 element diff

当节点处于同一层级,可能除夕只需要对这些节点进行移动,不需要每次都删除创建,react剔除添加唯一key来区分。react通过判断key是否存在相同节点,如果存在,再进行判断进行移动操作。不存在再进行相应的创建删除。

与vue的diff区别

  • 判断2个节点是否相同:vue认为className不一样,就不同,react则认为相同,只是属性不同,只需要更新其属性。
  • 同一层级对比:Vue从两端至中间对比,react从左至右对比。react策略存在短板,如果一个集合只吧最后一个移到第一个,react会移动前面所有节点,vue只移动最后一个节点到最前面。

最新文章

  1. node基础10:处理异常
  2. easyui自定义标签 datagrid edit combobox 手动输入保存不上问题解决办法
  3. webservice5
  4. strip_tags,htmlspecialchars,htmlentities,stripslashes,addslashes学习小结
  5. Using SSH on Linux
  6. 数据结构-List
  7. Kafka学习笔记
  8. 关于Sublime Text3 pyV8无法加载的问题
  9. 视频播放-SurfaceView
  10. 《JavaScript高级程序设计》读书笔记 ---RegExp 类型
  11. 3359: [Usaco2004 Jan]矩形
  12. 14.什么是jsp动作
  13. exit(0)与exit(1),return三者区别(详解)
  14. windows下安装Mysql—图文详解
  15. netty 的 Google protobuf 开发
  16. 027-Session状态提供程序
  17. C++ map<key , value> key值为指针
  18. 类中的函数带有self,不带self的区别
  19. Java类和对象的概念
  20. 网摘关于BarCodeControl控件

热门文章

  1. 往hbase插入数据,你会选择哪种?
  2. Django入门4 数据库设计
  3. Performance-Schema
  4. 一份ChatBot开源工程介绍(H5 + WX + KOA)
  5. git 本地删除修改文件后从远程拉取
  6. simplexml_load_string 转换xml为数组
  7. phpspreadsheet 中文文档(八)读写文件+读取文件
  8. ASP.NET Core 中间件Diagnostics使用 异常和错误信息
  9. html5 canvas手写字代码(兼容手机端)
  10. Mybaties的简单使用(全当做复习了)