react 的生命周期包括了挂载、更新、卸载阶段,这几个阶段的函数在不同的版本也有所不同,先来看看比较早期的生命周期函数都有哪些吧。
React <16.3
一、挂载阶段
componentWillMount()
该函数仅在将要挂载的的阶段执行,在 render 前调用。在 V16.3 将其重新命名为 UNSAFE_componentWillMount,在原来的命名上加了 UNSAFE_ 前缀,很明显说明了这是一个不安全的生命周期函数 (不推荐使用) 。在 V16.x 上仍然可以使用原来的命名,但是会报警告,在未来的 V17.x 上将会彻底改名为 UNSAFE_componentWillMount。
此方法是服务端渲染唯一会调用的生命周期函数。
componentDidMount()
在组件挂载后立即调用。可以在这里进行发送请求获取数据和添加订阅操作。
二、更新阶段
componentWillReceiveProps(nextPorps)
在已挂载的组件接收新的 props 之前被调用 (在 render 前),nextProps 为更新后的值。在 V16.3 将其重新命名为 UNSAFE_componentWillReceiveProps,在原来的命名上加了 UNSAFE_ 前缀,很明显说明了这是一个不安全的生命周期函数 (不推荐使用) 。在 V16.x 上仍然可以使用原来的命名,但是会报警告,在未来的 V17.x 上将会彻底改名为 UNSAFE_componentWillReceiveProps。
shouldComponentUpdate(nextProps, nextState)
此函数会返回一个布尔值来判断是否要进行更新组件操作。如果返回了 false,则不会调用 UNSAFE_componentWillUpdate(),render() 和 componentDidUpdate()。nextProps, nextState 均为更新后的值。
componentWillUpdate(nextProps, nextState)
在 shouldComponentUpdate 返回了 true 之后,render 之前执行。在 V16.3 将其重新命名为 UNSAFE_componentWillUpdate,在原来的命名上加了 UNSAFE_ 前缀,很明显说明了这是一个不安全的生命周期函数 (不推荐使用) 。在 V16.x 上仍然可以使用原来的命名,但是会报警告,在未来的 V17.x 上将会彻底改名为 UNSAFE_componentWillUpdate。
componentDidUpdate(prevProps, prevState, snapshot)
在组件更新完成后执行。prevProps, prevState 为更新前的值。如果组件实现了 getSnapshotBeforeUpdate (在 16.3 中加入的生命周期函数,不常用) ,则它的返回值将作为 componentDidUpdate 的第三个参数 snapshot 参数传递。否则此参数将为 undefined。
三、卸载阶段
componentWillUnmount()
在组件即将卸载时调用,在这里必须要进行一些清理操作,比如:取消订阅、清除定时器、取消网络请求等。
React 16.3
在 React 16.3 中删除了 3 个 ‘will’ 生命周期函数,分别是:componentWillMount、componentWillReceiveProps、componentWillUpdate;添加了 2 个 ‘get’ 生命周期函数,分别是:getDerivedStateFromProps、getSnapshotBeforeUpdate。
static getDerivedStateFromProps(ptops, state)
该方法为静态方法。会在调用 render 方法之前调用,在初始挂载及父组件引起的更新时会被调用。它应返回一个对象来更新 state,如果返回 null 则不更新任何内容。
getSnapshotBeforeUpdate(prevProps, prevState)
发生在 render 之后,可以读取 DOM 但是不能操作。参数 prevProps, prevState 为更前的值,返回值为下一个要执行的生命周期函数 componentWillDidUpdate 的第三个参数 snapshot。
React ^16.4
这里的修改相对于 16.3 就很小了,没有添加也没删除生命周期函数,就是修改了 getDerivedStateFromProps 的触发机制。将其的触发机制改成了初始挂载时及无论什么引起的更新都会执行。