React生命周期

192 阅读4分钟

注意:只有类组件才具有生命周期方法,函数组件是没有生命周期方法的。

React 生命周期(旧)

挂载阶段

1、constructor

组件被调用时,首先会调用组件的构造方法。这个构造方法接收一个props参数,是从父组件中传入的属性对象,如果父组件没有传入属性而组件自身定义了默认属性,那么这个props指向的就是组件的默认属性。你必须在这个方法中首先调用super(props)才能保证props被传入组件中。

constructor通常用于初始化组件的state以及绑定事件处理方法。

2、componentWillMount

这个方法在组件被挂载到DOM前被调用,只会被调用一次,(很少会用到),在这个方法中调用this.setState不会引起组件的重新渲染。

3、render

是定义组件时唯一必要的方法。需要注意的是,render并不负责组件的实际渲染工作,它只是返回一个UI的描述,真正的渲染出也面DOM的工作由React自身负责。render是纯函数,在这个方法中不能执行有副作用的操作,所以不能在render中调用this.setState,这个会改变组件的状态。

4、componentDidMount

组件被挂载到DOM之后调用,只会调用一次。这个时候已经获取到DOM结构,所以依赖DOM节点的操作可以放到这个方法中。这个方法还通常用于向服务器请求数据。这个方法中调用this.setState会引起组件的重新渲染。

更新阶段

1、componentWillReceiveProps (nextProps)

该方法只在props引起的组件更新过程中,才会被调用。State引起的组件更新并不会触发该方法的执行。方法参数nextProps是父组件传递给当前组件的新的props。但是需要注意,父组件传递给子组件的props可能不会发生变化,所以,我们往往需要比较nextPropsthis.props来决定是否执行props发生变化后的逻辑,比如根据新的props调用this.setState触发组件的重新渲染。

2、shouldComponentUpdate (nextProps, nextState)

该方法决定组件是否继续执行更新过程。该方法返回true时,组件继续更新过程;返回false时,组件更新停止,后续的componentWillUpdate、render、componentDidUpdate也不会被调用。一般通过比较nextProps, nextState和组件当前的props、state决定这个方法的返回结果。

该组件可以用来减少组件不必要的渲染,从而优化组件的性能。

3、componentWillUpdate (nextProps, nextState)

shouldComponentUpdate返回true以后,组件进入重新渲染的流程,进入componentWillUpdate,这里同样可以拿到nextPropsnextState。一般也很少用到。

注意,shouldComponentUpdatecomponentWillUpdate中都不能调用setState,否则会引起循环调用问题,render永远无法被调用,组件也无法正常渲染。

4、componentDidUpdate (prevProps, prevState)

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

5、render

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

卸载阶段

1、componentWillUnmount

该方法在组件被卸载前调用,可以在这里执行一些清理工作,比如清除使用的定时器,清除在componentDidMount中手动创建的DOM元素等,避免引起内存泄漏。

React 生命周期(新)

挂载阶段

1、constructor

2、static getDerivedStateFromProps ()不常用

getDerivedStateFromProps 会在调用 render 方法之前调用,并且在初始挂载及后续更新时都会被调用。它应返回一个对象来更新 state,如果返回 null 则不更新任何内容。

此方法无权访问组件实例。如果你需要,可以通过提取组件 props 的纯函数及 class 之外的状态,在getDerivedStateFromProps()和其他 class 方法之间重用代码。

请注意,不管原因是什么,都会在每次渲染前触发此方法。这与 UNSAFE_componentWillReceiveProps 形成对比,后者仅在父组件重新渲染时触发,而不是在内部调用 setState 时。

3、render

4、componentDidMount

更新阶段

1、static getDerivedStateFromProps()不常用

2、shouldComponentUpdate

3、render

4、getSnapshotBeforeUpdate()

getSnapshotBeforeUpdate() 在最近一次渲染输出(提交到 DOM 节点)之前调用。它使得组件能在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置)。此生命周期方法的任何返回值将作为参数传递给 componentDidUpdate()

此用法并不常见,但它可能出现在UI处理中,如需要以特殊方式处理滚动位置的聊天线程等。

应返回 snapshot 的值(或 null)。

5、componentDidUpdate