首先什么叫做生命周期函数,生命周期函数指的是在某一个时刻组件会自动调用执行的函数。比如之前的render函数,当state和props发生改变的时候,render函数会被重新执行,那么他是自动的被组件调用执行的。所以render函数实际上就是一个生命周期函数。
再看constructor()算不算一个生命周期函数呢?当组件创建的时候,constructor会被自动的调用执行,所以把constructor理解成一个生命周期函数也是可以的,但是constructor这个东西并不是react所独有的,他是es6语法中就带着的一个函数,所以我们不把他归类到react的生命周期函数里面。但是constructor和react的生命周期函数没有太大的区别。他也是在某个时刻会被组件调用的方法。
Initialization
再看图,对于react组件来说,他会经历一些过程,Initialization指的是初始化过程,这个时候组件会初始化自己的一些数据,比如props,比如state,那么是在哪里做的初始化,constructor就是我们初始化的位置,在这里会定义state,会接收props。
Mounting
初始化之后,会被渲染,然后挂载到页面上,所以会经历一个流程,叫做Mounting。Mounting就是挂载的意思,所以初始化之后就会去挂载,我们之前看的只有render函数,其实大家可以看到,在组件第一次将要挂载到页面中,他还会有两个生命周期函数,一个是componentWillMount,一个是componentDidMount。componentWillMount在组件即将被挂载到页面到时刻自动执行。与之对应的就是componentDidMount,顾名思义,组件被挂载了。也就是componentDidMount他会在组件被挂载到页面之后,自动被执行。
componentWillMount和componentDidMount只在挂载的时候执行,也就是第一次挂载页面的时候会被执行。
Updation
还有一个流程,叫做Updation,也就是组件更新的流程。什么叫做组件更新呢,在数据变化的时候组件就会被更新,在组件更新的过程中,也会涉及到一些新的生命周期函数。首先看图,组件更新会发生在什么情况下,要么props发生了变化,要么states发生了变化,也就是数据发生变化的时候,页面更新会被执行。但是props发生变化和states发生变化的时候,他的流程会略微的不同。当props发生变化的时候,有一个生命周期函数componentWillReceiveProps会被执行。这个东西在state发生变化的时候好像并没有被执行。所以她们两的差异就在这么个函数之上。我们先看无论state发生变化,还是props发生变化的时候,她们有一个共性。她们都会执行一些共有的生命周期函数。
第一个共有的生命周期函数叫什么,叫做shouldComponentUpdate。他会在组件被更新之前,他会自动被执行。但是shouldComponentUpdate要求返回一个布尔类型的返回结果。我更愿意把他翻译成,你的组件需要被更新吗?如果返回一个false,意思就是我不需要更新我的组件。所以相当于对shouldComponentUpdate做了一个回答,所以在输入input里面的内容,页面不会产生任何的反馈,shouldComponentUpdate后面的函数都不会被执行了。所以一般来说,页面都会返回true。然后继续往下面走,会执行一个componentWillUpdate
componentWillUpdate,组件被更新之前,他会自动执行,但是他在shouldComponent之后被执行,如果shouldCoponent返回true才会被执行,返回false就不会被执行了。当domponentWillUpdate发生改变之后,render函数会被执行。
一旦render更新好了之后,componentDidUpdate会被执行。组件更新完成之后,他会被执行。
然后我们再回过头看componentWillReceiveProps。这个生命周期函数会在什么时候执行呢?这个生命周期函数会有一点特殊。当一个组件没有props参数的时候,这个生命周期函数是不会被执行的。 当一个要从父组件接收参数,只要父组件的render函数被重新执行了,子组件的这个生命周期函数就会被执行。也就是说如果这个组件第一次存在于父组件中,不会执行,如果这个组件之前已经存在与父组件中,才会执行。
Unmounting
最后,我们看最后Unmounting这个过程中,一个生命周期函数,叫做componentWillUnmount。Mounting是组件挂载到页面的一个过程。那么unmounting就是把这个组件从页面去除的一个过程。