React源码 - 初始化元素

版本:17.0.0
创建调试项目可以下载此项目 - 地址 (https://github.com/mzvast/debug-react-ts)

一. 从React项目初始加载项目源码分析,分析如下代码在 React中的执行过程
在这里插入图片描述
从 ReactDOM的 render 方法开始调试
在这里插入图片描述
下图中主要创建了一个 FiberRootNode 对象,包含 containerInfo(挂载的元素), current对象(RootFiber )
在这里插入图片描述
此图中为 FiberRoot 中添加 current 值的代码
在这里插入图片描述
此图中为 RootFiber 添加 queue 的代码
在这里插入图片描述
更新方法 unbatchedUpdates 调用 传入函数中的方法 updateContainer,updateContainer方法创建了一个更新 update
在这里插入图片描述
下图中的enqueueUpdate方法将 update 值 附加到 RootFiber 的 updateQueue.shared.pending对象中
在这里插入图片描述
scheduleUpdateOnFiber => performSyncWorkOnRoot => renderRootSync(根据 ReactDOM.render传入的children为起点构建 Fiber 和 alternate )
--------------------------------------------------------------------------------renderRootSync函数执行之后 commitRoot (更新 dom 树)

renderRootSync => prepareFreshStack => createWorkInProgress
下图中的方法复制了 RootFiber ,并赋值给了 RootFiber.alternate
在这里插入图片描述

在这里插入图片描述

renderRootSync => workLoopSync => performUnitOfWork
在这里插入图片描述
一直循环 workInProgress ,next 为 begin 函数的返回值,next 为 null 时这个节点遍历完成,执行 completeUnitOfWork
在这里插入图片描述
beginWork 根据 tag 创建 Fiber 元素 => updateHostRoot
在这里插入图片描述
updateHostRoot => cloneUpdateQueue 克隆了 workInProgress.updateQueue, 目的是不再和 RootFiber (current) 引用同一个对象,更改 workInProgress.updateQueue 时 RootFiber (current) 的 updateQueue 不会改变
在这里插入图片描述
在这里插入图片描述
updateHostRoot => processUpdateQueue
processUpdateQueue 函数
1.将RootFiber (current).updateQueue.shared.pending中的 update赋值到了 updateQueue.firstBaseUpdate,updateQueue.lastBaseUpdate,并清空了 pending的值
在这里插入图片描述

2.workInProgress(alternate).updateQueue.shared.pending中的 update 赋值到了 updateQueue.baseState 和 memoizedState,并清空了 pending的值
在这里插入图片描述
updateHostRoot => reconcileChildren => reconcileChildFibers
根据传入的 children 创建 Fiber, 并将值添加到 workInProgress.child上
在这里插入图片描述
reconcileChildFibers
根据不同的节点类型
1.如果此元素有子元素,则根据子元素为单个的情况创建Fiber, 并将 return 字段指向父元素,为多个的情况则遍历子元素,通过sibling字段连接子元素,将第一个子元素为父元素的子元素
2.如何没有子节点, 则 workInProgress.child 值为空,执行上述提到的 更新 dom 的 方法 commitRoot
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值