vue3 diff算法

85 阅读1分钟

根据一个例子来学习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是多出来的,进行新增

image.png

缺点:相同节点无需替换,复用就可以了,只需要进行新增DDD即可,这时候就体现出key的作用了。

2.有key的diff算法,分为5步

有key就可以进行标记和复用

第一步:进行前序算法:

image.png 里面有一个isSameTypeNode方法,接受2个参数是旧的虚拟节点和新的虚拟节点,返回的结果是:是否是相同节点

image.png

尾序对比,A和A相同,B和B相同,C和DDD部相同,则跳出前序算法,进行尾顺序对比。C和C比较,D和D比较,跟vue2的区别是vue2虽然也进行头和头,尾和尾,但是也进行了头和尾比较,而vue3则不在进行交叉比较,进行最长递增子序列算法。如果新增子节点就走第三步,少了子节点就走第四部

image.png

第五步是最麻烦的,进行最长递增子序列算法

image.png