介绍
生命周期分为三个阶段:
- 挂载:已经插入真实dom
- 渲染(更新):正在被重新渲染
- 卸载:已经移出真实dom
那么,在这些阶段,会有哪些生命周期函数呢?
- 挂载
- constructor
- getDerivedStateFromProps
- render
- componentDidMount
- 渲染(更新)
- getDerivedStateFromProps
- shouldComponentUpdate
- render
- getSnapshotBeforeUpdate
- componentDidUpdate
- 卸载
- componentWillUnmount
本篇讲的是React v16.3之后的组件生命周期函数
详解各个阶段生命周期函数
constructor
顾名思义,就是React组件的构造函数,通常,仅用于以下两种情况
- 初始化state
- 为事件处理函数绑定实例
不能在构造函数内调用
this.setState()
因为this.setState会调用this.updater中的enqueueSetState, 而this.updater是注入的方式,在刚开始时(即constructor阶段,还没有注入新的updater),使用的是默认的updater,即会抛出一个error(warning)。而注入updater是在实例化组件后立即注入的,所以只有在constructor中使用this.setState无效。
getDerivedStateFromProps
static getDerivedStateFromProps(nextProps, state)
静态方法,在初始化和后续更新前被调用。
参数:第一个参数为即将更新的 props, 第二个参数为上一个状态的 state , 可以比较props 和 state来加一些限制条件,防止无用的state更新。
返回值:返回一个对象来更新 state, 如果返回 null 则不更新任何内容。
render
在React class组件唯一必须实现的方法,用于渲染DOM。
不要在
render里面setState, 否则会触发死循环导致内存崩溃。
componentDidMount
该生命周期方法在挂载后立即调用。可以在该方法发送网络请求,启用事件监听,调用this.setState()
shouldComponentUpdate
shouldComponentUpdate(nextProps, nextState)
该方法在组件更新前调用,可以控制组件是否更新,返回true则组件更新,false则不更新。
参数:第一个是即将更新的 props 值,第二个是即将更新后的 state 值。可以根据更新前后的 props 或 state 来比较加一些限制条件,决定是否更新,进行性能优化。
不要在
shouldComponentUpdate里面setState, 否则会触发死循环导致内存崩溃。
getSnapshotBeforeUpdate
在最近一次的渲染输出被提交之前调用。也就是说,在 render 之后,即将对组件进行挂载时调用。
它可以使组件在 DOM 真正更新之前捕获一些信息,此生命周期返回的任何值都会作为参数传递给
componentDidUpdate()。如不需要传递任何值,那么请返回 null
componentDidUpdate
该方法会在更新后会被立即调用。首次渲染不会执行。
参数:参数,第一个是上一次props值。 第二个是上一次state值。如果组件实现了 getSnapshotBeforeUpdate() 生命周期(不常用),第三个是“snapshot” 参数传递
componentWillUnmount
该方法在组件即将被卸载或销毁时调用。该方法主要用于移除事件监听,取消定时器等。