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

react 生命周期函数及用法

发布网友 发布时间:2024-09-15 06:49

我来回答

1个回答

热心网友 时间:2024-11-11 15:59

React组件的生命周期

React组件拥有丰富的生命周期钩子函数,遍布它的各个阶段。

其生命周期可被分为3个阶段:挂载(Mounting)、更新(Updating)和卸载(UnMounting)。

一、挂载阶段

这是React组件生命周期的第一个阶段,也可以称为组件出生阶段,这个阶段组件被初始化,获得初始的props并定义将会用到的state。

此阶段结束时,组件及其子元素都会在UI中被渲染(DOM,UIview等),我们还可以对渲染后的组件进行进一步的加工。

挂载阶段,组件会完成它的首次渲染,先执行初始化,再被挂载到真实的DOM中,其中依次调用的方法有constructor()、componentWillMount()、render()和componentDidMount()。除了render(),其他三个方法都只会运行一次。

getDefaultPropos:只调用一次,实力之间共享引用。getInitialState:初始化每个实例特有的状态。componentWillMount:render之前最后一次修改状态的机会。render:只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和DOM输出。componentDidMount:成功render并渲染完成真实DOM后触发,可以修改DOM。

1. constructor()

在生命周期中,类的构造函数constructor()会率先被执行,用于初始化组件的状态、接收外部传递进来的数据、绑定成员方法的this指向等工作。(只执行一次)

2. componentWillMount()

componentWillMount():会运行在render()之前,它是渲染之前的回调函数。不过,由于在这个方法中执行的任务都能提前到constructor()中,因此实际项目中很少会用到它。(只执行一次)

3. render()

render():是在定义组件时必须声明的方法,它是一个无副作用的纯函数,可根据组件的props和state得到一个React元素、null或false等返回值,并且在render()方法中不能调用改变组件状态的this.setState()方法。注意,将元素渲染到页面DOM中的工作都由React负责,而不是render()方法。

4. componentDidMount()

componentDidMount():会运行在render()之后,它是渲染之后的回调函数。此时组件已被挂载到页面中,可以执行DOM相关的操作,例如异步读取服务器中的数据并填充到组件中、调用jQuery代码等。(只执行一次)

二、更新阶段

引起组件更新(即重新渲染)的方式有三种:

第一种:由父组件向下传递props(即调用父组件的render()方法)引起的更新,依次会调用五个方法:componentWillReceiveProps() shouldComponentUpdate() componentWillUpdate() render() componentDidUpdate()

第二种:通过改变自身state(即调用this.setState()方法)引起的更新,会忽略componentWillReceiveProps()方法,只执行四个回调函数。

第三种:通过组件的forceUpdate()方法强制更新,只有后三个回调函数会被执行。

1. componentWillReceiveProps()

componentWillReceiveProps():常用于执行props更新后的逻辑,只有第一种更新方式才会调用它。

该方法能接收一个名为nextProps的参数,表示父组件传递进来的新的props。

当需要通过this.setState()方法将nextProps中的数据同步到内部状态时,要先比较nextProps和this.props中的值是否相同,再决定是否执行同步。

由于在componentWillReceiveProps()中能调用this.setState()方法,因此为了避免进入一个死循环,在调用this.setState()方法更新组件时就不会触发它。

2. shouldComponentUpdate()

shouldComponentUpdate():用于决定是否继续组件的更新。

它能接收2个参数:nextProps和nextState,分别表示新的props和state。

通过比较nextProps、nextState和组件当前的this.props、this.state能得出一个布尔类型的返回结果。

当返回结果为false时,组件会停止更新,后续的componentWillUpdate()、render()和componentDidUpdate()也不会被执行。

将这个方法使用恰当的话,能减少冗余的渲染,优化组件的性能。

3. componentWillUpdate()

componentWillUpdate():运行在render()之前,接收2个参数,提供更新之后的props和state。

4. componentDidUpdate()

componentDidUpdate():运行在render()之后,接收2个参数,提供更新之前的props和state。

注意,在componentWillUpdate()中,不能调用this.setState()方法,以免发生不必要的死循环。

三、卸载阶段

当组件在从DOM中被卸载之前,会触发一个无参数的componentWillUnmount()方法。在该方法内适合做些清理的工作,例如清除定时器、移除多余的DOM元素等。

四、图示

灰底的方法表示在其内部能调用this.setState()方法。

五、过时和新增的回调方法

1. 过时

从React v16.3开始,有3个生命周期方法被标记为过时:componentWillMount()、componentWillReceiveProps()和componentWillUpdate()。

目前它们仍然有效,但不建议在新代码中使用,官方为它们新增了一个以“UNSAFE_”作为前缀的别名。

2. 新增

React v16新增了两个生命周期方法,如下所列。

【1】static getDerivedStateFromProps(nextProps, prevState)

静态方法getDerivedStateFromProps()用来替代componentWillReceiveProps()。

它在render()方法之前触发,包含两个参数:nextProps和prevState,分别表示新的props和旧的state。

如果返回一个对象,那么更新state;如果返回null,那么就不更新state。

【2】getSnapshotBeforeUpdate(prevProps, prevState)

getSnapshotBeforeUpdate()方法用来替代componentWillUpdate()。

它在最近一次渲染输出(即更新DOM)之前触发,包含两个参数:prevProps和prevState,分别表示旧的props和旧的state,返回值会成为componentDidUpdate()的第三个参数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怀孕四个月补钙可以吗 孕妇吃什么时候钙片好 孕妇吃什么钙片最好 怀孕补钙是必须的吗?孕妇钙片品牌哪个好? ...在长高的黄金发育时期,会影响容貌五官的变化吗,不仅没有发育到变... 冬至吃饺子的诗词 立冬吃饺子的暖心诗词 宁波全封闭学校有哪些 宁波市北仑区小港镇会计学校在那? 或红联镇也可以 江南教育集团小港中心幼儿园园况介绍 红联哪里有报暑假班 男生经常说123是什么意思啊? 抖音123睡催眠术是什么梗-123睡催眠术梗意思及出处分享 手机摔了屏幕变绿色了还闪怎么回事 手机摔了屏幕怎么变绿色了还闪呢? 论述数学史在教育教学各阶段(导入、探索、应用)的作用。 我想在情人节那天吧我的房子简单的改造一下 给我女朋友一个浪漫的小屋... 液晶电视50E510DE如何下载应用,我以接U盘了! 昆明有黄金鹅鞋吗? 三国杀至尊终极版空白备用卡有什么用 蒿忧的成语蒿忧的成语是什么 陪我到可可西里去看海是谁唱的? 肺部有炎症用什么药 淘宝维权超时怎么办 淘宝退款超时未处理怎么办?淘宝退款次数多了会怎样? 淘宝退款超时会自动退款吗?淘宝退款超时未处理怎么办? 淘宝平台退款超时未处理是什么情况? ...29岁晋升上尉正连级,那么如果33岁他无法晋升少校,是否会在35岁转业... 思域中控没激活之前能听歌嘛 思域不启动发动机可以听歌吗? 茅台年产量多少吨 我用过两次电烤箱玻璃门都烧炸了怎么回事 乐观面对困难的英文句子 韭菜放冰箱两天会不会坏掉 韭菜放冰箱保存两天可以吗 韭菜放冰箱冷藏好吗 韭菜能放冰箱冷藏吗 乌鲁木齐发往玛纳斯的第一班车几点 成都十大顶级酒店排名,成都周边景区高端酒店排名 婚后买的车算不算共同财产 我是个电脑新手,不知道怎么安装杀毒软件和怎么杀毒呀 java格式的杀毒软件,给我推荐几个 (2024年)必入腮红排行榜,腮红哪个牌子好用。 (2024年)腮红推荐必入大牌有哪些?新手必入的腮红排行榜。 国产的腮红有哪些质地不错好上色? 平价腮红有哪些 颜色超美的腮红推荐 好用到哭,5款少女感超强的腮红推荐榜! PAUL&JOE哪款腮红的适合黄黑皮使用? 胭脂热卖排行榜10强:兰蔻柔美胭脂第8 第2很适合亚洲肌肤 适合油性肤质使用的腮红有哪些? 头皮出现不规则红疹及水泡样怎么回事 头皮很痒而且起红疹,像青春痘一样,早期是有好多的头屑,后来就开始起... 头皮和身上都有一些红疹中间冒水泡的东西是什么病?