Skip to content

Commit 8ea6fb4

Browse files
committed
✨ function component
1 parent c7cd2ef commit 8ea6fb4

File tree

2 files changed

+54
-23
lines changed

2 files changed

+54
-23
lines changed

main.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import * as MiniReact from "./react";
22

3-
const element = MiniReact.createElement(
4-
"h1",
5-
{
6-
id: "foo",
7-
},
8-
MiniReact.createElement("a", null, "bar"),
9-
MiniReact.createElement("b"),
10-
);
3+
const element = () =>
4+
MiniReact.createElement(
5+
"h1",
6+
{
7+
id: "foo",
8+
},
9+
MiniReact.createElement("a", null, "bar"),
10+
MiniReact.createElement("b"),
11+
);
1112

1213
const container = document.querySelector("#app");
13-
MiniReact.render(element, container);
14+
MiniReact.render(MiniReact.createElement(element), container);

react/render.js

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ function commitRoot() {
3737
function commitWork(fiber) {
3838
if (!fiber) return;
3939

40-
const domParent = fiber.parent.dom;
40+
// 获取父级 DOM 节点
41+
let domParentFiber = fiber.parent;
42+
while (!domParentFiber.dom) {
43+
domParentFiber = domParentFiber.parent;
44+
}
45+
const domParent = domParentFiber.dom;
4146

4247
if (fiber.effectTag === EFFECT_TAGS.PLACEMENT && fiber.dom) {
4348
// 新增节点
@@ -47,7 +52,7 @@ function commitWork(fiber) {
4752
updateDom(fiber.dom, fiber.alternate.props, fiber.props);
4853
} else if (fiber.effectTag === EFFECT_TAGS.DELETION) {
4954
// 删除节点
50-
domParent.removeChild(fiber.dom);
55+
commitDeletion(fiber, domParent);
5156
}
5257

5358
commitWork(fiber.child);
@@ -95,20 +100,22 @@ function updateDom(dom, prevProps, nextProps) {
95100
});
96101
}
97102

98-
// Fiber
99-
// 当我们完成一个 Fiber 节点的渲染后,如果它有子节点 child,那么下一个工作单元就是这个 child
100-
// 如果它没有子节点 child,那么它的兄弟节点 sibling 就是下一个工作单元
101-
// 如果它既没有子节点 child,也没有兄弟节点 sibling,那么下一个工作单元是它父节点的兄弟节点 sibling
102-
// 如果父节点也没有兄弟节点 sibling,那么我们就继续向上遍历,直到找到有 sibling 的节点,或者到达根节点
103-
function performUnitOfWork(fiber) {
104-
// add dom node
105-
if (!fiber.dom) {
106-
fiber.dom = createDom(fiber);
103+
function commitDeletion(fiber, domParent) {
104+
if (fiber.dom) {
105+
domParent.removeChild(fiber.dom);
106+
} else {
107+
commitDeletion(fiber.child, domParent);
107108
}
109+
}
108110

109-
// create new fibers
110-
const elements = fiber.props.children;
111-
reconcileChildren(fiber, elements); // 为当前节点创建子节点的 fiber
111+
function performUnitOfWork(fiber) {
112+
// 判断是否是函数组件
113+
const isFunctionComponent = fiber.type instanceof Function;
114+
if (isFunctionComponent) {
115+
updateFunctionComponent(fiber);
116+
} else {
117+
updateHostComponent(fiber);
118+
}
112119

113120
// return next unit of work
114121
if (fiber.child) {
@@ -124,6 +131,29 @@ function performUnitOfWork(fiber) {
124131
}
125132
}
126133

134+
function updateFunctionComponent(fiber) {
135+
// 1. 调用函数组件,获取新的元素
136+
const children = [fiber.type(fiber.props)];
137+
// 2. 为当前节点创建子节点的 fiber
138+
reconcileChildren(fiber, children);
139+
}
140+
141+
function updateHostComponent(fiber) {
142+
// add dom node
143+
if (!fiber.dom) {
144+
fiber.dom = createDom(fiber);
145+
}
146+
147+
// create new fibers
148+
const elements = fiber.props.children;
149+
reconcileChildren(fiber, elements); // 为当前节点创建子节点的 fiber
150+
}
151+
152+
// Fiber
153+
// 当我们完成一个 Fiber 节点的渲染后,如果它有子节点 child,那么下一个工作单元就是这个 child
154+
// 如果它没有子节点 child,那么它的兄弟节点 sibling 就是下一个工作单元
155+
// 如果它既没有子节点 child,也没有兄弟节点 sibling,那么下一个工作单元是它父节点的兄弟节点 sibling
156+
// 如果父节点也没有兄弟节点 sibling,那么我们就继续向上遍历,直到找到有 sibling 的节点,或者到达根节点
127157
function reconcileChildren(wipFiber, elements) {
128158
let index = 0;
129159
let oldFiber = wipFiber?.alternate?.child;

0 commit comments

Comments
 (0)