Skip to content

Commit 538421d

Browse files
committed
五: 3.diff 并添加 flag
1 parent 7eebaac commit 538421d

File tree

1 file changed

+50
-10
lines changed

1 file changed

+50
-10
lines changed

src/mini-react/reconciler.js

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,64 @@
11
export function reconcileChildren(workInProgress, elements) {
22
let index = 0; // 当前遍历的子元素在父节点下的下标
33
let prevSibling = null; // 记录上一个兄弟节点
4+
let oldFiber = workInProgress?.alternate?.child; // 对应的旧 fiber
45

5-
while (index < elements.length) {
6-
// 遍历子元素
6+
while (index < elements.length || oldFiber) {
7+
// 遍历 elements 和 oldFiber
78
const element = elements[index];
89
// 创建新的 fiber
9-
const newFiber = {
10-
element,
11-
return: workInProgress,
12-
stateNode: null,
13-
};
10+
let newFiber = null;
11+
const isSameType =
12+
element?.type &&
13+
oldFiber?.element?.type &&
14+
element.type === oldFiber.element.type;
15+
16+
// 添加 flag 副作用
17+
if (isSameType) {
18+
// type相同,表示更新
19+
newFiber = {
20+
element: {
21+
...element,
22+
props: element.props,
23+
},
24+
stateNode: oldFiber.stateNode,
25+
return: workInProgress,
26+
alternate: oldFiber,
27+
flag: 'Update',
28+
};
29+
} else {
30+
// type 不同,表示添加或者删除
31+
if (element || element === 0) {
32+
// element 存在,表示添加
33+
newFiber = {
34+
element,
35+
stateNode: null,
36+
return: workInProgress,
37+
alternate: null,
38+
flag: 'Placement',
39+
index,
40+
};
41+
}
42+
if (oldFiber) {
43+
// oldFiber存在,删除 oldFiber
44+
oldFiber.flag = 'Deletion';
45+
}
46+
}
47+
48+
if (oldFiber) {
49+
// oldFiber 存在,则继续遍历其 sibling
50+
oldFiber = oldFiber.sibling;
51+
}
52+
1453
if (index === 0) {
1554
// 如果下标为 0,则将当前fiber设置为父 fiber 的 child
1655
workInProgress.child = newFiber;
17-
} else {
18-
// 否则通过 sibling 作为兄弟 fiber 连接
56+
prevSibling = newFiber;
57+
} else if (newFiber) {
58+
// newFiber 和 prevSibling 存在,通过 sibling 作为兄弟 fiber 连接
1959
prevSibling.sibling = newFiber;
60+
prevSibling = newFiber;
2061
}
21-
prevSibling = newFiber;
2262
index++;
2363
}
2464
}

0 commit comments

Comments
 (0)