React系列之生命周期深入解析

【react全家桶学习】react的 (新/旧) 生命周期(重点) 相对比vue的生命周期,react显得复杂的多,光从名称上就比vue长,所以做好准备,不要放弃,坚持就是胜利、 阅读详情

React系列之生命周期深入解析

author huangteng


生命周期图列



图1

还有这个:


图2


两个图其实表示的很清晰了,现在我们详细的解析React的生命周期。


首先,react的生命周期可以分为三个阶段:

  1. 初始化
  2. 存在期
  3. 销毁

在源码里对应的就是MOUNTING、RECEIVE_PROPS、UNMOUNTING


初始化

图1、2中对初始化的过程描写的很清楚,就是3个方法完成4个步骤:

  1. 首先通过constructor方法完成对props和state的初始化。其中props是react从父组件继承过来的,state需要我们自己去定义。

  2. 接着是componentWillMount(),这个方法执行的时间点是在props和state初始化之后,render之前。这个时候可以在里面执行this.setState()操作,执行setState()并不会导致页面的渲染,只是单纯的state的合并操作。这个是初始化阶段在render之前最后一次可以修改组件state的机会。这个方法只执行一次,其实你们看图列也可以知道,初始化阶段的方法都是只执行一次的。这个方法相当于在组件渲染之前的准备工作。

  3. render(),组件渲染,render应该保持为一个纯函数。不要在里面有操作DOM的Bug,只能通过this.props和this.state访问数据。可以返回null或者false。就是啥都不渲染嘛。

  4. componentDidMount(),也是只执行一次。执行的时间点是在render之后。下一次重绘组件的入口之前。这个时候已经挂载到了DOM,所以在这个方法里面可以操作DOM,当然一般是通过ref进行。此时已可以使用其他类库来操作这个DOM。在服务端中,该方法不会被调用。当我们需要请求外部接口数据,一般都在这里处理(因为这里处理ajax,接下来的重绘(updating)阶段就可以直接用数据了)。但是在这里写一堆ajax你不觉得很混乱吗,交给redux吧。


存在期(updating)

首先在你第一次加载的时候,上述的初始化阶段一过去,就不会再有初始化这个阶段了,剩下的都是props和state的改变导致的不断updating的过程,所以我要说初始化的生命周期函数都是只执行一次呢。

这个时候我们的组件已经渲染出来了,用户也能够看到了,那么组件是不是就是一直不变了,那肯定是扯犊子嘛,随着用户的操作,比如点击按钮,发送信息啥的就会导致有新的props或者state从上层甚至上上层流入到我们刚刚新鲜出炉的组件里,这时就会触发组件的updating,导致UI视图的重绘。

触发的生命周期函数如下,这里要分两种情况。

  1. 如果是父组件传入了新的props,无论是传了新的key,还是原来的key赋予了新的value。这时会触发的是componmentWillReceiveProps(nextProps),记住哦,仔细看图1,如果仅仅state改变,props没变的时候,是不会触发这个生命周期函数了的,直接就跳过去进行shouldComponentUpdate()了。

  2. 当然如果没有props改变就是第二种情况,直接进行shouldComponentUpdate(),所以用componmentWillReceiveProps()是不是应该小小的考虑一下。

好,说清楚这个分叉的点,我们对componmentWillReceiveProps做个说明,首先这个函数执行的时机是父组件更新了子组件的props的时候,在这个函数里我们可以获取最新的props来更新props或者state。但是并不会导致重绘。

从state改变还是props改变分叉之后都会交汇到一点,shouldComponentUpdate,对没错,这个生命周期函数是重绘组件的阀门,它的返回值是一个boolean,默认返回true,如果返回false,那就简单多了,因为接下来的步骤都不会执行了,所以这是进行pureRender优化的函数,说白了就是进行deepCompare.当然这不是本章重点。

shouldComponentUpdate返true之后就会接着触发下一个生命周期函数

componmentWillUpdate(),其实和初始化阶段的componentWillMount差不多,就是重绘前的准备工作。唯一需要注意的是,这里面不能进行setState()或者更新props。因为这个函数自己就会把最新的state和props设置到this.state和this.props中,请把对state和props的更新放到componmentWillReceiveProps中好不。

然后是重绘(re-render)

最后是componmentDidUpdate()这个和componmentDidMount也差不多,也是可以获取真实DOM,可以用第三方库操作DOM


补充一点,updating期间的生命周期函数在初始化的时期是不会执行的哦。直白的说就比如componmentWillReceiveProps()函数肯定不会在你第一次初始加载组件的时候执行的。


销毁

销毁里面放一下清理工作,清除定时器啊之类的。略过。


深入解析前端进阶面试题:Vue 和 React 特别篇 掌握 Vue 和 React 的进阶知识对于前端开发者来说至关重要。通过深入理解框架的原理、生命周期、状态管理和性能优化等方面,可以在面试中展现出更高的技术水平。 阅读详情

相关推荐

Python之美——Python2与Python3多版本共存

Python多版本共存的方法Python2、Python3共存的方法python2下载及环境变量配置第一步、打开Python官网,下载Python2第二步、python2环境变量配置测试结果 Python2、Python3共存的方法 方法如下: 1.先确保不同版本解释器的python.exe所在的路径在环境变量中 2.拷贝各自的python.exe并重命名即可 步骤(理解不了下面有图示): 1、首先你需要将不同的python版本安装,且都已经将跟版本的环境变量配置好了,python3和2的下载方式

chenchen5152的博客 3944

React生命周期详解

从出生到成长,最后到死亡,这个过程的时间可以理解为生命周期。React的生命周期同理也是这么一个过程。 React的生命周期分为三个阶段:挂载期(也叫实例化期)、更新期(也叫存在期)、卸载期(也叫销毁期)。在每个周期中React都提供了一些钩子函数。 生命周期的描述如下: 挂载期:一个组件实例初次北创建的过程。 更新期:组件在创建后再次渲染的过程。 卸载期:组件在使用完后被销毁的过程。 组件的挂载: 组件在首次创建后,进行第一次的渲染为挂载期。挂载期有的一些方法会被依次触发,列举如下: constru.

qq_43717065的博客 2万+

ENVI5.6+SARscape实战:基于哨兵一号的PS与SBAS时序InSAR地表形变监测全流程解析

本文详细解析了使用ENVI5.6和SARscape软件基于哨兵一号数据进行PS与SBAS时序InSAR地表形变监测的全流程。从数据获取、预处理到PS-InSAR和SBAS-InSAR处理,提供了实用技巧和优化建议,帮助用户高效完成地表形变监测任务。

weixin_29245767的博客 1151

react生命周期详细介绍

react生命周期详解,挂载渲染,卸载和错误捕获

luobo2345的博客 2万+

【编号326】全国地灾数据全国25万多个地质灾害点空间分布数据

全国地质灾害点分布数据涵盖25万多个各类灾害点信息,为灾害防治提供重要依据。通过分析灾害分布规律,可识别高风险区,指导监测预警、应急避险和基础设施建设。多地成功案例(如湖北兴山崩塌避险、重庆长寿滑坡预警、湖南"挪床行动")证明,提前预警和科学防治能有效避免人员伤亡。云南省2024年通过预警体系成功避让31起灾害,保护1342人生命安全。这些实践表明,地质灾害防治需结合科技手段与群防体系,实现早预警、早处置。

千奇百怪无奇不有 1467

UG476 GT Transceivers文档翻译和自身理解

对UG476 Xilinx官方文档进行翻译的基础上加上自己的理解

weixin_45143788的博客 4594

React的生命周期

React 组件的生命周期 React中组件有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,初始化、运行中、销毁、错误处理(16.3之后) ( 共12个钩子函数 ) 注意: 生命周期钩子函数一定不要写成箭头函数 初始化 在组件初始化阶段会执行 5个钩子函数【 1个将来会使用 】 1. constructor( props ) construc...

csdnzlcheng的博客 4910

用Codex自动化挖掘电梯行业外贸客户:从关键词到22维深度分析

在B2B外贸客户开发中,精准定位垂直行业潜在客户是核心挑战。传统手动搜索效率低下,而数据驱动的工作流正成为解决方案。其原理在于将模糊的业务需求转化为机器可识别的结构化查询,通过组合行业核心关键词(如“Elevator Manufacturer”、“Elevator Maintenance”)与商业角色描述,系统性地从海量数据中筛选目标。这种自动化抓取技术的价值在于,它不仅生成客户名单,更通过多维数据分析(如公司规模、业务标签、数字足迹)构建初步的客户画像,为后续的优先级排序和个性化触达提供情报基础。在工业制

weixin_34054866的博客 453

React生命周期@12

本文介绍了React组件的生命周期及其三个阶段:初始化、更新和卸载。在初始化阶段,组件依次执行constructor()、getDerivedStateFromProps()、render()和componentDidMount();更新阶段涉及getDerivedStateFromProps()、shouldComponentUpdate()、render()、getSnapshotBeforeUpdate()和componentDidUpdate();卸载阶段执行componentWillUnmount

weibkreuz的专栏 920

YOLOv8改进-利用图像去雾网络UnfogNet提升检测精度的探索【附核心模块代码】

YOLOv8-UnfogNet联合模型的提出为目标检测和图像去雾领域提供了一个新的思路。通过将图像去雾网络和目标检测网络结合,不仅可以提升在恶劣天气下的目标检测精度,还能够为实际应用中的自动驾驶、监控安防等领域带来更强的鲁棒性和适应性。随着去雾技术和目标检测算法的不断发展,我们相信,这种联合方法将在多个领域中获得更加广泛的应用,并为进一步提升图像质量和检测精度做出重要贡献。

一键难忘的博客 3202

自监督学习原理与代码实战案例讲解

自监督学习原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 自监督学习的起源与发展 1.1.1 监督学习的局限性

AI天才研究院 620

我对 React V16.4 生命周期的理解

网上有很多关于 React 生命周期的文章,我也看了不少,为了梳理并加深我对此的理解,所以决定写这篇文章。本文主要梳理目前最新的 V16.4 的生命周期函数。本文参考了一些文章,在文末给...

LeviDing的博客 359

4.4 线上vs离线:使用 Langfuse 实现智能体的全方位无死角评估

本文介绍了如何利用Langfuse工具实现AI智能体的全方位评估,包括线上和离线两种评估方式。线上评估通过收集用户实时反馈(如点赞/点踩)来监控真实表现,而离线评估则通过创建标准化数据集进行批量测试和自动评分。文章详细演示了如何为"旅小智"AI应用添加反馈功能、创建评估数据集,并利用Langfuse SDK进行自动化评估和分析。通过这两种评估方式的结合,开发者可以建立数据驱动的AI质量保障体系,实现持续优化和版本迭代。

yonggeit的博客 3310

一份react 面试题

声明:题目是群里面看到的,并不完全。答案自己手撸 1、下面打印出b的值是?if(true){let b = 2}  alert(b). let不存在变量提升,且作用域只在代码块,输出undefined 2、const name = 'jack'; const age = 20; const person = {[name] : true, [age] : true}.  person对象的两...

qq_38719039的博客 8420

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

react源码解析1.开篇介绍和面试题

react源码解析1.开篇介绍和面试题 视频讲解(高效学习):点击学习 往期文章: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 5.jsx&核心api 6.legacy和concurrent模式入口函数 7.Fiber架构 8.render阶段 9.diff算法 10.commit阶段 11.生命周期 12.状态更新流程 13.hooks源码 14.手写hooks 15.scheduler&Lane 16.concurrent模式 17.c

zz2000aa的博客 117

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

react源码解析20.总结&第一章的面试题解答

react源码解析20.总结&第一章的面试题解答 视频讲解(高效学习):进入学习 往期文章: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 5.jsx&核心api 6.legacy和concurrent模式入口函数 7.Fiber架构 8.render阶段 9.diff算法 10.commit阶段 11.生命周期 12.状态更新流程 13.hooks源码 14.手写hooks 15.scheduler&Lane 16.concurre

潇晨1998的博客 121

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【前端知识】React 组件生命周期:从底层原理到实践场景

React 组件生命周期是组件从创建到销毁过程中自动调用的方法或钩子函数,分为挂载、更新和卸载三个阶段。React 16 引入的 Fiber 架构将渲染分为可中断的协调阶段(构建虚拟 DOM)和不可中断的提交阶段(更新真实 DOM)。Class 组件中,挂载阶段包括 constructor、render 和 componentDidMount;更新阶段涉及 shouldComponentUpdate、render 和 componentDidUpdate;卸载阶段执行 componentWillUnmoun

wendao76的专栏 595

React生命周期

React的新生命周期 组件生命周期的三个阶段 1.Mounting(加载阶段) 2.Updating(更新阶段) 3.Unmounting(卸载阶段) 旧的生命周期 Mounting(加载阶段:涉及6个钩子函数) constructor() 加载的时候调用一次,可以初始化state getDefaultProps() 设置默认的props,也可以用dufaultProps设置组件...

xueqing_的博客 4302

react生命周期原理解析

这篇文章是对之前的一片文章react生命周期整理提到的生命周期的解析,本文会从源码的角度,对react的各个生命周期的实现原理进行不太详细的分析 getDefaultProps与getInitialState 首先我们来看一下以下两个代码片段,第一个是用es5创建组件的方法,需要调用react的createClasss方法,第二个是es6创建组件的方法,定义一个类继承react.compone...

小敏哥的专栏 2719

freehire 源摄取流水线(Source Ingest Pipeline)设计详解:适配器契约、命名空间去重与事务性富化入队

本篇以 freehire 仓库中归档变更 `add-source-ingest-pipeline` 的能力规格为主线,逐条拆解"职位如何进入目录"的六个核心需求:模块化 Source 适配器契约、配置驱动的看板加载与快速失败、归一化写入路径、跨公司不冲突的 `external_id` 命名空间、再摄取时对富化结果的保护,以及可被 cron 调度的独立摄取命令。读完你可以独立实现一个新的 ATS 适

gitblog_00686的博客 419

Reactjs-Popup 组件库全面解析:一站式弹窗解决方案

Reactjs-Popup 是一个轻量级的 React 弹窗组件库,它可以帮助开发者快速构建各种类型的交互式弹窗组件。这个库最突出的特点是它的多功能性 - 通过单一组件即可实现模态框(Modal)、工具提示(Tooltip)和菜单(Menu)等多种交互元素。 ## 核心特性 1. **多合一解决方案** - 一个组件支持多种弹窗类型 - 无需为不同场景引入多个库 2. **极致轻

gitblog_01200的博客 1182

玩转Reactjs第四篇-组件(生命周期)

一、

恰恰虎的博客 735

Hooks 与 React 生命周期

一、Hooks 组件 函数组件的本质是函数,没有 state 的概念的,因此不存在生命周期一说,仅仅是一个render 函数而已。 但是引入Hooks之后就变得不同了,它能让组件在不使用 class 的情况下拥有 state,所以就有了生命周期的概念,所谓的生命周期其实就是useState、useEffect()和useLayoutEffect()。 即:Hooks 组件(使用了Hooks的函数组件)有生命周期,而函数组件(未使用Hooks的函数组件)是没有生命周期的。 下面,是具...

chengRantianxia的博客 9022

详细解说React生命周期

当我们使用各种框架开发程序时,当这个框架启动、程序刚运行时、各个页面之间的交互、数据渲染到页面上面、程序运行结束,应当会有个闭环的操作,而在这个环的起点和终点之间的各个节点,框架给给定一些特定函数供我们自行调用,方便我们执行一些操作,这便是生命周期。简单来说:组件从创建、更新到销毁的完整过程。其意义在于:有助于理解组件的运行方式、完成更复杂的组件功能、分析组件错误的原因等。在 React 中有函数组件和类组件。类组件中有生命周期函数,函数组件中用useEffect来代替生命周期函数的功能。

qq_52869537的博客 1598
上一篇: react+redux+router+webpack+immutable.js框架
下一篇: React系列之开发大型网站最佳实践
波比小金刚
博客等级 码龄11年 41粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值