react的生命周期钩子函数

首先我们先来掌握基本单词

掌握单词后会更好理解和记住生命周期:

constructor ------构造函数

component ------组件

will ------将要

get ------得到

default ------默认值

initial ------最初的

unsafe ------不安全的

static ------静态的

derived ------衍生的

should ------应该

update ------更新

unmount ------取消挂载

receive ------收到

总体分为三个阶段:

1.组件挂载

(1)constructor

可以理解为组件的第一个生命周期,一般会在这里初始化组件的内部状态(state),如果在这里面要使用this则必须在super()之后,如果在这里面需要使用props,那么需要把props作为参数传入。

在使用React.createClass()这种方式创建组件的时期,会有俩个生命周期:

getDefaultProps()

设置默认的props,也可以用defaultProps设置组件的默认属性。

//直接使用static defaultProps = {}这种方式来创建

getInitialState()

在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state。此时可以访问this.props

// 现在这个已经直接在constructor里使用this.state = {}这种方式来创建

(2)componentWillMount ------------ 17版本即将废除

组件将要挂载,这个生命周期基本上没有什么用,而且react*17版本之后废弃。

如果还想继续使用,可以使用UNSAFE_componentWillMount来代替。

这个生命周期,是除了初始化之外,唯一一个能够直接同步修改state的地方。

(3)static getDerivedStateFromProps

设置了这个生命周期就不能设置componentWillMount()

这是react16.3之后新增的一个生命周期,这是一个静态方法,静态方法没有this所以不能使用setState,需要return一个对象,这个对象就相当于setState里面的参数。

常用于强制性的根据props来设置state

(4)render

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。

这里是合成虚拟DOM,可以理解为,在这里实际上都还没有真实的dom。

(5)componentDidMount ajax请求生成DOM**********

渲染真实的DOM浏览器,在这里才可以得到DOM。这个生命周期就是相当重要的一个生命周期,ajax请求一般都在这里进行。

2.组建更新

分为俩种情况,state改变和props改变

如果state改变,会直接进行到组件更新的第二个shouldComponentUpdate,如果是props改变,会先走componentWillReceiveProps。

(1)componentWillReceiveProps -----17版本即将废除

16.4之前,由于在更新阶段,没有static getDeriveStateFromProps这个生命周期,如果有根据props来生成的state,就需要在这里重新设置一次。因为之前是在constructor里面根据props来初始化的state,constructor只会执行一次,所以要在componentWillReceiveProps来修正state。在新的版本里,static getDerivedStateFromProps这个生命周期不管是在装载还是更新的时候都会触发。因此,componentWillReceiveProps也只会工作到react17.

(2)shouldComponentUpdate 性能优化*

这个生命周期用于react的性能优化,接收俩个参数(nextProps,nextState)通常会根据这俩个参数和this.state,this.props来进行diff算法对比,根据比较的结果来return true或者false,如果return的是false,将不会再执行后面的生命周期。

(3)componentWillUpdate -----17版本即将废除

没什么卵用

(4)render

和mount阶段一样,生成虚拟DOM

(5)componentDidUpdate

同componentDidMount。

3.组件销毁

(1)componentWillUnmount

组件将要销毁,这里一般可以用来清理定时器,解绑某些事件。