问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

React生命周期

发布网友 发布时间:2022-09-05 15:43

我来回答

1个回答

热心网友 时间:2024-12-02 10:09

React的生命周期从广义上分为三个阶段:挂载、渲染、卸载

因此可以把React的生命周期分为两类:挂载卸载过程和更新过程。

下图是旧生命周期图

下图是新生命周期图

1.挂载卸载过程

<span id="jump1">1.1 constructor()</span>

constructor()中完成了React数据的初始化,它接受两个参数:props和context,当想在函数内部使用这两个参数时,需使用super()传入这两个参数。
注意:只要使用了constructor()就必须写super(),否则会导致this指向错误。

<span id="jump2">1.2 componentWillMount()</span>

componentWillMount()一般用的比较少,它更多的是在服务端渲染时使用。它代表的过程是组件已经经历了constructor()初始化数据后,但是还未渲染DOM时。

<span id="jump3">1.3 componentDidMount()</span>

组件第一次渲染完成,此时dom节点已经生成,可以在这里调用ajax请求,返回数据setState后组件会重新渲染

<span id="jump4">1.4 componentWillUnmount()</span>

在此处完成组件的卸载和数据的销毁。

原因:因为你在组件中的ajax请求返回setState,而你组件销毁的时候,请求还未完成,因此会报warning

解决方法:

2.更新过程

<span id="jump5">2.1 componentWillReceiveProps (nextProps)</span>

<span id="jump6">2.2 shouldComponentUpdate(nextProps,nextState)</span>

<span id="jump7">2.3 componentWillUpdate (nextProps,nextState)</span>

shouldComponentUpdate返回true以后,组件进入重新渲染的流程,进入componentWillUpdate,这里同样可以拿到nextProps和nextState。

<span id="jump8">2.4 componentDidUpdate(prevProps,prevState)</span>

组件更新完毕后,react只会在第一次初始化成功会进入componentDidmount,之后每次重新渲染后都会进入这个生命周期,这里可以拿到prevProps和prevState,即更新前的props和state。

<span id="jump9">2.5 render()</span>

render函数会插入jsx生成的dom结构,react会生成一份虚拟dom树,在每一次组件更新时,在此react会通过其diff算法比较更新前后的新旧DOM树,比较以后,找到最小的有差异的DOM节点,并重新渲染。

3.新增两个生命周期

<span id="jump10">3.1 getDerivedStateFromProps(nextProps, prevState)</span>

代替componentWillReceiveProps()。

老版本中的componentWillReceiveProps()方法判断前后两个 props 是否相同,如果不同再将新的 props 更新到相应的 state 上去。这样做一来会破坏 state 数据的单一数据源,导致组件状态变得不可预测,另一方面也会增加组件的重绘次数。

举个例子:

这两者最大的不同就是:
在 componentWillReceiveProps 中,我们一般会做以下两件事,一是根据 props 来更新 state,二是触发一些回调,如动画或页面跳转等。

I. 在老版本的 React 中,这两件事我们都需要在 componentWillReceiveProps 中去做。

II. 而在新版本中,官方将更新state与触发回调重新分配到了getDerivedStateFromProps 与componentDidUpdate中,使得组件整体的更新逻辑更为清晰。而且在getDerivedStateFromProps中还禁止了组件去访问this.props,强制让开发者去比较nextProps与prevState中的值,以确保当开发者用到getDerivedStateFromProps这个生命周期函数时,就是在根据当前的props来更新组件的state,而不是去做其他一些让组件自身状态变得更加不可预测的事情。

<span id="jump11">3.2 getSnapshotBeforeUpdate(prevProps, prevState)</span>

代替componentWillUpdate。

常见的 componentWillUpdate 的用例是在组件更新前,读取当前某个 DOM 元素的状态,并在 componentDidUpdate 中进行相应的处理。

这两者的区别在于:

I. 在React开启异步渲染模式后,在render阶段读取到的DOM元素状态并不总是和commit阶段相同,这就导致在componentDidUpdate中使用componentWillUpdate中读取到的DOM元素状态是不安全的,因为这时的值很有可能已经失效了。

II. getSnapshotBeforeUpdate会在最终的render之前被调用,也就是说在getSnapshotBeforeUpdate中读取到的DOM元素状态是可以保证与componentDidUpdate中一致的。
此生命周期返回的任何值都将作为参数传递给componentDidUpdate()。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
干货| 如何利用PPT绘制手绘图像(内含视频教学)。 小米Mix2s开发者选项的设置与应用指南(探索小米Mix2s开发者选项)_百度... 我今年41岁女,我想问一买哪种养老保险更合算,可以一次买吗?要多少... 我们家有营业执照。我现在41岁了。养老保险如何来买?一年,交多少钱? 搅拌桩的两喷两搅怎么理解 ...上关于一喷二搅、二喷二搅、二喷三搅、二喷四搅的具体做法 两搅两喷与四搅四喷的区别 三轴搅拌桩两搅四喷是什么意思 梦幻西游将军令怎么解绑 EXCEL表,求值? ...华邦健康今天股票行情?华邦健康2021下半年还能涨不? ...健康股票股市行情大盘?华邦健康股票能涨到多少? 国际医学这支股票怎么了?国际医学最高涨到多少?国际医学股票有年底分红... 缴纳了公积金还可填报租房租金个税扣除吗? 个人所得税住房公积金贷款如何扣除 现代名图汽车仪表盘故障灯图解 名图转向系统故障灯什么情况下会亮 名图前挡风黄色灯亮怎么回事 北京现代名图发动机故障灯亮什么原因? 现代名图仪表盘故障灯 现代名图仪表盘故障灯图解 形容书读的多的成语 今晚六合有什么数 六合采今晚开什么 古代有谁能被称为杀神? 历史上坑杀是怎么杀的 拐弯抹角,出路在前是什么生肖 顶2米的管道,工作坑得多大 二六合三七并二是什么数字或者生肖? 带坑里去了什么意思 React的生命周期 react 生命周期执行顺序,render执行条件 为何要使用React Hooks? react生命周期函数 React Hook介绍与使用心得 高德地图导航没有声音怎么回事 我梦见了老师瞪我,过几天老师就针对我,为什么 1986农历九月初二下午出生的幸运数 项目生命周期 项目生命周期包含哪些阶段?什么阶段最重要? 什么是“项目生命周期”? 「干货贴」项目经理:一起来认识一下项目的生命周期吧 【PMP知识点总结】项目生命周期的类型、PMO分类及组织结构对项目的影... 中国护照去朝鲜要签证吗? 个人去朝鲜怎么办签证 可以同时移民美国和加拿大吗 移民到加拿大了,可以签到美国吗 儿子的别称是什么 古代称自己的儿子是什么 女人一般多少岁会欲望强? 成语,什么万物