Match-id-0ec66063b933d6f41b5ae51bd1357e88e68b67ae

This commit is contained in:
* 2022-03-18 10:35:40 +08:00 committed by *
parent 816a199970
commit 337b729402
2 changed files with 17 additions and 10 deletions

View File

@ -376,7 +376,7 @@ function diffArrayNodesHandler(
if (rightNewNode) {
appendNode(rightNewNode);
setVNodesCIndex(rightNewNode.next, prevNewNode.cIndex + 1);
setVNodesCIndex(rightNewNode.next, rightNewNode.cIndex + 1);
}
return resultingFirstChild;
@ -464,14 +464,14 @@ function diffArrayNodesHandler(
if (rightNewNode) {
appendNode(rightNewNode);
setVNodesCIndex(rightNewNode.next, prevNewNode.cIndex + 1);
setVNodesCIndex(rightNewNode.next, rightNewNode.cIndex + 1);
}
return resultingFirstChild;
}
// 设置vNode中的cIndex属性cIndex是节点在children中的位置
function setVNodesCIndex(startChild: VNode, startIdx: number) {
function setVNodesCIndex(startChild: VNode | null, startIdx: number) {
let node: VNode | null = startChild;
let idx = startIdx;

View File

@ -187,15 +187,12 @@ export function onlyUpdateChildVNodes(processing: VNode): VNode | null {
return processing.child;
}
// 当跳过子树更新时,需要更新子树path
// 当跳过子树更新时,父节点path更新时需要更新所有子树path
if (processing.child && processing.path !== processing.child.path.slice(0, processing.path.length)) {
// 更新子树path
const queue: VNode[] = [processing];
while (queue.length) {
const vNode = queue.shift()!;
// bfs更新子树path
const queue: VNode[] = [];
// 忽略processing path重新计算
vNode.path = vNode.parent.path + vNode.cIndex;
const putChildrenIntoQueue = (vNode: VNode) => {
const child = vNode.child;
if (child) {
queue.push(child);
@ -206,6 +203,16 @@ export function onlyUpdateChildVNodes(processing: VNode): VNode | null {
}
}
}
putChildrenIntoQueue(processing.child);
while (queue.length) {
const vNode = queue.shift()!;
vNode.path = vNode.parent.path + vNode.cIndex;
putChildrenIntoQueue(vNode)
}
}
// 子树无需工作
return null;