- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
本文由简悦SimpRead转码,原文地址
由于ReactDOM.render的内容比较多,所以这里拆分了上中下三讲来讲解。
在上一讲,我们站在宏观角度对Fiber的架构分层和迭代动机有了充分的把握。从本讲开始,以
首次渲染为切入点,拆解Fiber架构下ReactDOM.render所触发的渲染链路,结合源码理解整个链路
中所涉及的初始化、render和commit等过程。
ReactDOM.render调用栈的逻辑分层
开篇先给到你一个简单的ReactAppDemo:
importReactfromreact;
importReactDOMfromreact-dom;
functionApp(){
return(
divclass
divclass
h1我是标题/h1
p我是第一段话/p
p我是第二段话/p
/div
/div
);
}
constrootElement=document.getElementById(root);
ReactDOM.render(App/,rootElement);
Demo启动后,渲染出的界面如下图所示:
现在请你打开Chrome的Performance面板,点击下图红色圈圈所圈住的这个“记录”按钮:
然后重新Demo页面对应的本地服务地址,待页面刷新后,终止记录,便能够得到如下图右下角
所示的这样一个调用栈大图:
放大该图,定位“src/index.js”这个文件路径,我们就可以找到ReactDOM.render方法对应的调用
栈,如下图所示:
从图中你可以看到,ReactDOM.render方法对应的调用栈非常深,中间涉及的函数量也比较大。如果
这使你心里发虚,请先不要急于撤退——分析调用栈只是我们理解渲染链路的一个,我们的目
的是借此提取关键逻辑,而非理解调用栈中的每一个方法。就这来说,你首先需要把握的,就是整
个调用链路中所包含的三个阶段:
图中scheduleUpdateOnFiber方法的作用是调度更新,在由ReactDOM.render发起的首屏渲染这个
场景下,它触发的就是performSyncWorkOnRoot。performSyncWorkOnRoot开启的正是我们反复
强调的render阶段;而commitRoot方法开启的则是真实DOM的渲染过程(commit阶段)。因此
以scheduleUpdateOnFiber和commitRoot两个方法为界,我们可以大致把ReactDOM.render的调
用栈划分为三个阶段:
1.初始化阶段
2.render阶段
3.commit阶段
接下来,我们就一起来看看这三个阶段分别做了哪些事情。
注:渲染链路串讲已被拆分为3个,本讲解的是初始化阶段。
拆解ReactDOM.render调用栈——初始化阶段
首先我们提取出初始化过程中涉及的调用栈大图:
图中的方法虽然看上去又多又杂,但做的事情清清爽爽,那就是完成Fiber树中基本实体的创建。
什么是基本实体?基本实体有哪些?问题的答案藏在源码里,这里我为你提取了源码中的关键逻辑,首
先是legacyRenderSubtreeIntoContainer方法。在ReactDOM.render函数体中,以下面代码所示的
调用了它:
returnlegacyRenderSubtreeIntoContainer(null,element,container,false,
callback);
而legacyRenderSubtreeIntoContainer的关键逻辑如下(解析在注释里):
functionlegacyRenderSubtreeIntoContainer(parentComponent,children,container,
forceHydrate,callback){
varroot=container._reactRootContainer;
varfiberRoot
您可能关注的文档
- 综合2010oracle或其附属less13.pdf
- 考评存在问题及整改措施.pdf
- 寸屏彩屏裸屏规格书.pdf
- 选修模块单元测试题.pdf
- 蒸汽氧气流化气化器供给sofc orc联合发电厂实验数值分析gt2013-95552.pdf
- 审计基础习题全课程sj jyh.pdf
- 考研初试翻译词汇其他.pdf
- 必需验证器ullnull fieldname字符串否sfielderror内建.pdf
- 即时栅栏杆快速入门课程1使用预设从下拉菜单中选择instantfencel启动.pdf
- 普通高等学校全国统一考试卷理含答案.pdf
- 上课《归园田居(其一)》课件28张.pptx
- 色彩的魅力课件55.ppt
- 山水田园诗导学练习鉴赏.ppt
- 部编版《白鹭》课件.pptx
- 《Excel在财务中的应用》项目七 全面预算编制方法与应用 教学课件.pptx
- 《Excel在财务中的应用》项目六 利润管理决策模型与应用 教学课件.pptx
- 《Excel在财务中的应用》项目五 运营资金的管理 教学课件.pptx
- 《Excel在财务中的应用》项目四 项目投资管理决策与应用 教学课件.pptx
- 《Excel在财务中的应用》项目三 筹资管理决策模型与应用 教学课件.pptx
- 《Excel在财务中的应用》项目二 Excel 常用函数基础 教学课件.pptx
文档评论(0)