React 生命周期

248 阅读3分钟

react 的生命周期包括了挂载、更新、卸载阶段,这几个阶段的函数在不同的版本也有所不同,先来看看比较早期的生命周期函数都有哪些吧。

React <16.3

react_lifecycle-16.3-before

一、挂载阶段

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’ 生命周期函数,分别是:componentWillMountcomponentWillReceivePropscomponentWillUpdate;添加了 2‘get’ 生命周期函数,分别是:getDerivedStateFromPropsgetSnapshotBeforeUpdate
react_lifecycle-16.3

static getDerivedStateFromProps(ptops, state)

该方法为静态方法。会在调用 render 方法之前调用,在初始挂载及父组件引起的更新时会被调用。它应返回一个对象来更新 state,如果返回 null 则不更新任何内容。

getSnapshotBeforeUpdate(prevProps, prevState)

发生在 render 之后,可以读取 DOM 但是不能操作。参数 prevProps, prevState 为更前的值,返回值为下一个要执行的生命周期函数 componentWillDidUpdate 的第三个参数 snapshot

React ^16.4

这里的修改相对于 16.3 就很小了,没有添加也没删除生命周期函数,就是修改了 getDerivedStateFromProps 的触发机制。将其的触发机制改成了初始挂载时及无论什么引起的更新都会执行。 react_lifecycle-^16.4