@@ -37,7 +37,12 @@ function commitRoot() {
3737function 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 的节点,或者到达根节点
127157function reconcileChildren ( wipFiber , elements ) {
128158 let index = 0 ;
129159 let oldFiber = wipFiber ?. alternate ?. child ;
0 commit comments