2026/10/7 16:16:26

React 底层揭秘(Stack 协调器)第 6 部分:创建初始子组件与递归挂载流程解析

React 底层揭秘(Stack 协调器)第 6 部分:创建初始子组件与递归挂载流程解析 教程前端文档【免费下载链接】Under-the-hood-ReactJSEntire React code base explanation by visual block schemes (Stack version)项目地址https://gitcode.com/gh_mirrors/un/Under-the-hood-ReactJS点击查看免费下载本篇为《Under the hood ReactJS》Stack 协调器逐部分拆解系列的第 6 部分中文版对应 stack/languages/chinese/book/Part-6.md英文版见 stack/book/Part-6.md。当父级组件的 DOM 组件挂载完成后接下来要处理它的直接子组件子组件如何被实例化、如何接入父级 DOM 树、以及整个挂载流程如何递归地铺开。读完本文你将掌握ReactMultiChild.mountChildren、ReactChildReconciler、DOMLazyTree.queueChild的协作方式并能在脑海中完整重建自定义组件 → DOM 组件 → 子组件的递归挂载回路。本系列以 React v15.4.2Stack 协调器版本为分析对象完整流程见 总体流程图并配套 中文版系列目录 与 英文版 Intro 中的调试用示例代码。建议将本文与下方第 6 部分的流程图分屏对照阅读。一、从组件本身已创建到创建初始子组件上一部分第 5 部分完成了 DOM 组件挂载时的属性差分与更新此时父级组件自身的创建已经收官。但一个组件很少是光杆司令——render返回的div之下往往还有按钮、文本、嵌套组件等子内容。于是挂载过程的下一个关键节点就是创建并挂载初始子组件create initial children。这一步拆解为两个动作子组件的挂载调用this.mountChildren让子组件被实例化并完成自身挂载子组件与父级的连接调用DOMLazyTree.queueChild把子组件挂载产出的节点挂接到父级组件对应的树形结构上。换句话说mountChildren负责造出子组件queueChild负责接上父组件。下文先聚焦更核心的mountChildren。二、ReactMultiChild管理子组件的专职模块文档明确指出React 用一个独立的模块来管理子组件即ReactMultiChild文档给出的源码路径为src/renderers/shared/stack/reconciler/ReactMultiChild.js。从命名与职责划分看这是一个典型的多子组件处理器它把批量实例化子组件和把子组件挂载结果装配进父级这类公共逻辑集中封装供不同环境下复用。由于本仓库仅收录说明文档与示意图而未收录 React 源码本身此处以文档描述为准。mountChildren方法内含两个主要任务实例化子组件借助ReactChildReconciler完成子组件的实例化挂载子组件对每个已实例化的子组件执行挂载。这里的子组件到底是什么文档给出了清晰的二分法一个简单的 HTML 标签如div、span、button→ 需要实例化ReactDOMComponent另一个自定义组件如示例代码中的ChildCmp→ 需要实例化ReactCompositeComponent。相应地挂载流程也取决于子组件的类型。这正是 React 组件树能够混合原生标签与自定义组件的基础协调器在遍历子节点时必须按元素类型分派到不同的构造器与挂载路径。三、整体挂载流程的再一次回顾文档在此处安排了一次暂停与复盘用一张总览图overall-mounting-scheme.svg把目前走过的全部挂载对象串联起来帮助读者整理对象的先后顺序。整体流程如下实例化自定义组件React 为每个自定义组件实例化ReactCompositeComponent期间会调用componentWillMount等生命周期钩子并挂载该组件调用构造函数挂载过程中首先调用自定义组件的构造函数创建组件实例调用 render 并创建 React 元素调用组件的render方法简单例子中返回一个divReact.createElement据此创建 React 元素——它既可以被直接调用也可以在 render 中由 Babel 解析 JSX 后替代标签。但元素对象还不是最终目标创建 DOM 组件针对div需要一个 DOM 组件因此在实例化阶段从元素对象出发创建ReactDOMComponent实例挂载 DOM 组件这一步的实际含义是创建真实 DOM 元素、绑定事件监听器等处理 DOM 组件的直接子组件为它们创建实例并挂载。根据每个子项是自定义组件还是普通 HTML 标签分别递归回到步骤 1或步骤 5随后再依次处理所有内嵌元素。可以看出整个加载过程本质上是自定义组件 → 元素 → DOM 组件 → 子元素的递归展开非常直接。四、挂载收尾componentDidMount子组件递归挂载完成意味着整个组件树的 DOM 构建告一段落。文档指出挂载基本完成后下一步就是把componentDidMount方法加入执行队列enqueue等事务的close阶段统一触发——这一细节与第 7 部分stack/languages/chinese/book/Part-7.md中通过reactMountReady.notifyAll触发回调的机制前后呼应。挂载阶段到此画上句号。五、本质提炼从完整流程图到最简回路在总结部分文档对第 6 部分逐步做减法把流程浓缩成三个层次方便读者把非本质的细节剥离出来先看完整方案 part-6.svg移除冗余、次要的部分后得到简化版 part-6-A.svg再调整空格与对齐得到重构版 part-6-B.svg最终沉淀出第 6 部分的本质回路 part-6-C.svg它将被并入整个系列的最终 mounting 总览图。六、系列脉络与下一步本部分处于挂载链路的中间环节前承 第 5 部分 的 DOM 属性更新后启 第 7 部分 的将生成的 HTML 元素插入文档容器、关闭事务并触发componentDidMount。当你把第 6 部分子组件递归挂载这一环放入整个 mounting 流程后React 初次渲染的全貌就只差最后一步落盘到真实 DOM 了。全流程总览图all-page-stack-reconciler.svg缩放版截图挂载整体方案图overall-mounting-scheme.svg中文版第 6 部分正文Part-6.md英文原版Part-6.md赞分享教程前端文档【免费下载链接】Under-the-hood-ReactJSEntire React code base explanation by visual block schemes (Stack version)项目地址https://gitcode.com/gh_mirrors/un/Under-the-hood-ReactJS点击查看免费下载相关推荐React Stack Reconciler 挂载流程解析第 6 部分mountChildren 与初始子组件挂载全链路React Stack Reconciler 挂载流程解析第 6 部分mountChildren 与初始子组件挂载全链路 React 的挂载mounti教程前端文档ReactJS 底层揭秘深入 ReactCompositeComponent.mountComponent——Stack 协调器挂载流程第 3 部分ReactJS 底层揭秘深入 ReactCompositeComponent.mountComponent——Stack 协调器挂载流程第 3 部分 本文教程前端文档Under-the-hood ReactJSStack 版Part 6 源码解析初始子元素挂载与递归式 Mounting 全流程Under the hood ReactJSStack 版Part 6 源码解析初始子元素挂载与递归式 Mounting 全流程 本篇文章源自仓库系列文档教程前端文档上一篇如何通过开源游戏自动化工具彻底解放你的游戏时间智能脚本终极指南下一篇让电子课本从云端走到桌面你的个人教学资源管家创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考