两者算法比较不同
Vue的key值节点比较方法:
分别对oldS、oldE、S、E
两两做sameVnode
比较,有四种值,旧集合的开头和结束(OldS, OldE)新集合的开头和结束( S E),当其中两个能匹配上那么真实dom中的相应节点会移到Vnode相应的位置,这句话有点绕,打个比方
- 如果是oldS和E匹配上了,那么真实dom中的第一个节点会移到最后
- 如果是oldE和S匹配上了,那么真实dom中的最后一个节点会移到最前,匹配上的两个指针向中间移动
- 如果四种匹配没有一对是成功的,那么遍历
oldChild
,S
挨个和他们匹配,匹配成功就在真实dom中将成功的节点移到最前面,如果依旧没有成功的,那么将S对应的节点
插入到dom中对应的oldS
位置,oldS
和S
指针向中间移动。
大意就是每次比较四个key值,匹配上的就移动,指针向后或者向前移动,都匹配不上,则遍历旧集合中有没有S,没有就添加,有就移动旧集合的S
React中key值节点比较方法:
是将旧的虚拟dom的同一层级的key值节点作为一个集合(旧的集合)
新的虚拟dom的同一层级的key值节点作为一个集合(新集合)
比如 旧集合为:
a b c d
新集合为:
b c a d
比较方法为:
先遍历新的集合,判断有哪一些节点需要添加和删除;
再判断节点的移动:
遍历新的集合;判断新集合中的节点在旧集合位置是否大于之前访问过得旧节点的最大位置;
比如以上述两集合作为例子:
1.新集合的第一个元素为b,b在旧集合的位置为1(index),之前访问过得旧节点的最大位置为0,1>0;所以b节点不需要移动
2.新集合的第二个元素为c,在旧集合的位置为2,之前访问过得旧节点的最大位置为1,2>1,所以c节点不需要移动;
3.新节点第三个元素为a,在旧集合的位置为0(index),之前访问过得旧节点的最大位置为2,0<2,所以a需要移动;
4,新节点第四个元素为d,在旧集合的位置为3(index),之前访问过得旧节点的最大位置为2,3>2,所以d不需要移动;
这个就是react的key值节点的比较方法