React 组件生命周期详解

本文深入探讨了React组件的生命周期,包括constructor、getDerivedStateFromProps、render、componentDidMount等关键函数,并通过实例代码演示了生命周期在不同场景下的执行顺序,如组件初始化、状态更新、props改变、组件卸载等,旨在帮助开发者更好地理解和优化React应用的性能。
摘要由CSDN通过智能技术生成

本文详细介绍了 React 生命周期的用法以及各个阶段的生命周期进行,并且用实例代码做了详细演示。代码位置

话不多说,先上图

React生命周期图解

上图是基于 React 16.4 之后的生命周期图解。如感觉不对,请先查看 React 版本


React 生命周期详解

各个阶段的生命周期函数

constructor 构造函数

在 React 组件挂载之前被调用,实现 React.Component 的子类的构造函数时,要在第一行加上 super(props)。

React 构造函数通常只用于两个目的:

  • 通过分配一个对象到 this.state 来初始化本地 state
  • 将 事件处理程序 方法绑定到实例

如果没有初始化状态(state),并且没有绑定方法,通常不需要为 React 组件实现一个构造函数。

不需要在构造函数中调用 setState(),只需将初始状态设置给 this.state 即可 。

static getDerivedStateFromProps(nextProps, prevState)

getDerivedStateFromProps 在每次调用 render 方法之前调用。包括初始化和后续更新时。

包含两个参数:第一个参数为即将更新的 props 值,第二个参数为之前的 state

返回值:返回为 null 时,不做任何副作用处理。倘若想更新某些 state 状态值,则返回一个对象,就会对 state 进行修改

该生命周期是静态函数,属于类的方法,其作用域内是找不到 this

render()

render() 方法是类组件中唯一必须的方法,其余生命周期不是必须要写。
组件渲染时会走到该生命周期,展示的组件都是由 render() 生命周期的返回值来决定。

注意:
如果 shouldComponentUpdate() 方法返回 false ,render() 不会被调用。

componentDidMount()

在 React 组件装载(mounting)(插入树)后被立即调用。

componentDidMount 生命周期是进行发送网络请求、启用事件监听的好时机

如果有必要,可以在此生命周期中立刻调用 setState()

shouldComponentUpdate(nextProps, nextState)

在组件准备更新之前调用,可以控制组件是否进行更新,返回 true 时组件更新,返回 false 组件不更新。

包含两个参数,第一个是即将更新的 props 值,第二个是即将跟新后的 state 值,可以根据更新前后的 props 或 state 进行判断,决定是否更新,进行性能优化

不要 shouldComponentUpdate 中调用 setState(),否则会导致无限循环调用更新、渲染,直至浏览器内存崩溃

getSnapshotBeforeUpdate(prevProps, prevState)

getSnapshotBeforeUpdate() 在最近一次的渲染输出被提交之前调用。也就是说,在 render 之后,即将对组件进行挂载时调用。

它可以使组件在 DOM 真正更新之前捕获一些信息(例如滚动位置),此生命周期返回的任何值都会作为参数传递给 componentDidUpdate()。如不需要传递任何值,那么请返回 null

componentDidUpdate(prevProps, prevState, snapshot)

componentDidUpdate() 在更新发生之后立即被调用。这个生命周期在组件第一次渲染时不会触发。

可以在此生命周期中调用 setState(),但是必须包含在条件语句中,否则会造成无限循环,最终导致浏览器内存崩溃

componentWillUnmount()

componentWillUnmount() 在组件即将被卸载或销毁时进行调用。

此生命周期是取消网络请求、移除监听事件清理 DOM 元素清理定时器等操作的好时机

注意:
componentWillMount()、componentWillUpdate()、componentWillReceiveProps() 即将被废弃,请不要再在组件中进行使用。因此本文不做讲解,避免混淆。

生命周期执行顺序

挂载时
  • constructor()

  • static getDerivedStateFromProps()

  • render()

  • componentDidMount()

更新时
  • static getDerivedStateFromProps()

  • shouldComponentUpdate()

  • render()

  • getSnapshotBeforeUpdate()

  • componentDidUpdate()

卸载时
  • componentWillUnmount()

生命周期中是否可调用 setState()

初始化 state
  • constructor()
可以调用 setState()
  • componentDidMount()
根据判断条件可以调用 setState()
  • componentDidUpdate()
禁止调用 setState()
  • shouldComponentUpdate()

  • render()

  • getSnapshotBeforeUpdate()

  • componentWillUnmount()


实例演示

源码地址
下面根据一个父子组件的props 改变、state 改变以及子组件的挂载/卸载等事件,对各生命周期执行顺序进行理解,有兴趣的同学可以一起看一下,也可以下载代码自己进行测试。

编写组件代码

父组件:Parent.js
import React, {
    Component } from 'react';

import Child from './Child.js';

const parentStyle = {
   
    padding: 40,
    margin: 20,
    border: '1px solid pink'
}

const TAG = "Parent 组件:"

export default class Parent extends Component {
   

    constructor(props) {
   
        super
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值