根据一个例子来学习diff算法
往数组arr添加一个D,
const arr:string[] = ['A','B','C','D']
arr.splice(2,0,'DDD') // ['A','B','DDD','C','D']
1.没有key的diff算法,分为3步
A和B哪怕一样,也会进行替换,DDD替换C,C替换D,D是多出来的,进行新增
缺点:相同节点无需替换,复用就可以了,只需要进行新增DDD即可,这时候就体现出key的作用了。
2.有key的diff算法,分为5步
有key就可以进行标记和复用
第一步:进行前序算法:
里面有一个isSameTypeNode方法,接受2个参数是旧的虚拟节点和新的虚拟节点,返回的结果是:是否是相同节点
尾序对比,A和A相同,B和B相同,C和DDD部相同,则跳出前序算法,进行尾顺序对比。C和C比较,D和D比较,跟vue2的区别是vue2虽然也进行头和头,尾和尾,但是也进行了头和尾比较,而vue3则不在进行交叉比较,进行最长递增子序列算法。如果新增子节点就走第三步,少了子节点就走第四部
第五步是最麻烦的,进行最长递增子序列算法