最近从vue使用转到react使用,vue
以前研究过vue的diff算法,闲来看了看react的diff源码,写一点本身的看法react
diff算法发生在虚拟dom上算法
判断是否同一个节点:selector和key都要同样dom
diff规则:函数
若是条件1知足,新旧节点头部指针日后移。oop
若是条件2知足,新旧节点尾部指针往前移。判断是否新的子节点先循环完(头尾位置指针判断),是:就是删除了节点,否:新增了节点,新增的节点按照条件4添加性能
若是条件3知足,须要移动新的头部子节点到旧的尾部子节点后面spa
若是条件4知足,须要移动新的头部子节点到旧的头部子节点前面指针
若是4种都未匹配到,而且指针条件未知足,须要loop匹配索引
vue在把被移动的节点和匹配的节点设置为undefined
从左往右依次对比,利用元素的index和标识lastIndex进行比较,若是知足index < lastIndex就移动元素,删除和添加则各自按照规则调整
跨层不比较,同层比较,跟vue同样
新节点的位置是lastIndex,旧节点的位置是index。重新的节点中依次读取节点索引,对比旧的节点数据索引
最恶心的状况:若是把最后一个元素移到最前面,react会依次移动节点向后
类似的地方:vue和react的diff算法,都是不进行跨层级比较,只作同级比较。
不一样点: