1. 首页

React源码解析(二):组件的类型与生命周期

在上一篇文章《React 源码解析(一):组件的实现与挂载》中,我们阐述了 React 组件的实现和挂载。现在我们来一起探究组件的生命周期。

我们已经知道,只有在挂载流程开始后,才会触发组件的生命周期,生成ReactElement类型的 js 对象,通过解析组件对象内部所携带的信息,获得对应的 HTML 信息,插入指定的 DOM 容器中,最终完成视图的渲染。那么组件的生命周期在这一过程中是如何触发的呢?

其实研究组件的声明周期,就是更深入的研究组件的挂载过程。

组件的生命周期

在上一篇文章的最后,我们知道ReactDOM.render()方法根据传入的参数不同,在内部通过工厂方法生成四种不同类型的封装组件:

  • ReactEmptyComponent
  • ReactTextComponent
  • ReactDOMComponent
  • ReactCompositeComponent

在执行挂载流程时,通过执行每种封装组件内部的mountComponent方法触发生命周期,但显然生命周期只在 React 自定义组件中存在,也就是ReactCompositeComponent。因为其他三种组件是不存在生命周期的,所以我们先来分析下相对容易的不存在生命周期的三种内部组件。

1.ReactEmptyComponent

通过ReactEmptyComponent.create()方法创建,该方法最终调用的是ReactDOMEmptyComponent方法,看下源码:

React源码解析(二):组件的类型与生命周期

因为组件为空,所以几乎所有参数设置为 null,也无关生命周期,只有组件的挂载和卸载。在关键方法mountComponent中,我们看到最终返回的是形如<!-->的 HTML,也就是空,因此插入真实 DOM 的也是空。

2.ReactTextComponent

通过ReactHostComponent.createInstanceForText()方法创建,我们直接看mountComponent即可:

React源码解析(二):组件的类型与生命周期

ReactDOMTextComponent相比ReactDOMEmptyComponent的处理稍微复杂一些,但是逻辑大致相同。escapeTextContentForBrowser方法内部对参数进行空格的校验处理,最终通过简单的' '+参数方法将参数转化为字符串并返回。

3.ReactDOMComponent

通过ReactHostComponent.createInternalComponent()方法创建,同样我们直接看mountComponent就好:

React源码解析(二):组件的类型与生命周期

因为 dom 元素同样没有生命周期,ReactDOMComponent会对传入的div,span等标签通过switch进行识别和处理,除此之外流程与上述两类组件基本相同。

Js 中文网 – 前端进阶资源教程 https://www.javascriptC.com/,typescript 中文手册
专注分享前端知识,你想要的,在这里都能找到

4.ReactCompositeComponent

自定义组件是 React 组件的重点,通过ReactCompositeComponentWrapper()方法创建,最终调用ReactCompositeComponentMixin.mountComponent方法创建组件的 HTML。由于该函数非常长,感兴趣的读者请前往ReactCompositeComponent.js阅读源码,在此我们直接用图例给出该函数的逻辑:

React源码解析(二):组件的类型与生命周期

基于以上,可以看出生命周期的执行的目的就是为了解析ReactElement获得 HTML。由此我们更新上一篇文章中的四大组件类型的总结表格:

nextElement实际参数结果
null/false创建ReactDOMEmptyComponent组件
object && type === string虚拟DOM创建ReactDOMComponent组件
object && type !== stringReact组件创建ReactCompositeComponent组件
string字符串创建ReactDOMTextComponent组件
number数字创建ReactDOMTextComponent组件

最后基于第一篇文末给出的思维导图,我们进行细节完善: (点击可查看大图)

React源码解析(二):组件的类型与生命周期

回顾:

作者:ssssyoki
链接:https://juejin.im/post/59ca03b9518825177c60d10b

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:React源码解析(二):组件的类型与生命周期

链接:https://www.javascriptc.com/3953.html

« 源码分析:react hook 实践
打造工业级推荐系统(一):推荐算法工程师的成长之道»
Flutter 中文教程资源

相关推荐

QR code