对于updateChildren里最后一个情况判断不理解

来源:4-13 深入diff算法源码-updateChildren函数

Darkholme

2021-05-13

问题一:老师,这个updateChildren里一开始会通过开始结束的顺序往里递进一个一个通过sameVnode方法对比新旧node的key和sel是否一致。如果有例外了话(我这里就是理解成sameVnode返回了false,也就是Key和sel其中之一或者两者都对应不上)。那么就会走进拿新的key去和所有的旧key进行对比,然后如果对应上了就再去比较sel,sel没对应就直接插入新的。可是如果对应上了sel,就是这里,为什么会有这种情况?如果对应上了sel那么不就是key和sel都相等吗,那这种情况的新node应该已经在前面通过sameVnode返回true了然后执行递归patchVnode了,为啥这里还要判断这种情况?
之前的指针前后推进对比会有落下的,没对比过的组合吗?如果有,那我就能理解了,如果没有我就不理解了。。。

问题二:为啥要用patchVnode而不是用patch去更新,因为patchVnode不会去判断新旧节点是否有text和children或者是空的的情况,但patch会,用patch会不会好点,能应对更多种情况

写回答

2回答

双越

2021-05-14

第一个问题。这里是在 key 对应上的前提下,去判断 sel 属性是否相等(课程代码都有注释)。这个逻辑之前没做过。

第二个问题。patch 是入口函数,patchVnode 是内部函数,这两者定位就不一样。内部代码不会去调用 path 函数的。

0
0

双越

2021-05-13

额。。。这一大段文字,看懵了。你可以一个一个提问,每个问题尽量简单、直接。


PS:之前也有很多同学大篇的、多问题的提问,我都让他们先拆分问题。

0
1
Darkholme
问题一:为什么updateChildren函数里,最后几行的那个判断sel相等的情况要存在?我认为这个情况已经在之前判断过了。(就是这里我不确定这种情况判断过没有,所以有疑问) 问题二:为啥要用patchVnode而不是用patch去更新,因为patchVnode不会去判断新旧节点是否有text和children或者是空的的情况,但patch会,用patch会不会好点,能应对更多种情况
2021-05-13
共1条回复

前端框架及项目面试 聚焦Vue3/React/Webpack

面向1-3年前端的框架及项目面试“刚需内容”

4695 学习 · 1667 问题

查看课程