React组件生命周期
旧版本
一、挂载阶段
- 组件将要挂载:componentWillMount
- 组件挂载完成:componentDidMount
constructor(构造函数)–>componentWillMount(组件将要挂载)–>render(数据渲染)–>componentDidMount(组件挂载完成)
二、更新阶段
- 父组件中改变了props传值时触发的函数:componentWillReceiveProps
- 是否要更新数据:shouldComponentUpdate
- 将要更新数据:componentWillUpdate
- 数据更新完成:componentDidUpdate
shouldComponentUpdate(是否要更新数据,返回true才会继续更新)–>componentWillUpdate(组件将要更新)–>render(重新渲染)–>componentDidUpdate(组件更新完成)
三、销毁阶段
- 组件将要销毁:componentWillUnmount
新版本
一、挂载阶段
- 组件每次render、组件构建之后、每次获取新的props或state:getDerivedStateFromProps
- 组件渲染完成(只调用一次):componentDidMount
constructor(构造函数)–>getDerivedStateFromProps(组件构建完成之后)–>render(渲染)–>componentDidMount(挂载完成)
二、更新阶段
- 组件每次render、组件构建之后、每次获取新的props或state:getDerivedStateFromProps
- 组件接收到新的props或state:shouldComponentUpdate
- update发生时、render之后,dom渲染之前:getSnapshotBeforeUpdate
- 组件更新完成:componentDidUpdate
getDerivedStateFromProps(组件render前调用)–>shouldComponentUpdate(是否要更新数据,返回true才会继续更新)–>render(重新渲染,创建虚拟dom,diff算法)–>getSnapshotBeforeUpdate(更新前,可以覆盖componentWillUpdate的所有用法)–>componentDidUpdate(组件更新完成)
三、销毁阶段
- 组件卸载之前:componentWillUnMount
四、错误处理
- 后代组件抛出错误后(渲染阶段):getDerivedStateFromError
- 任何一处的javascript报错: componentDidCatch
如果发生错误,可以通过调用 setState 使用 componentDidCatch() 渲染降级 UI,但在未来的版本中将不推荐这样做。 可以使用静态 getDerivedStateFromError() 来处理降级渲染。
总结
- React16新的生命周期弃用了componentWillMount、componentWillReceiveProps,componentWillUpdate
- 新增了getDerivedStateFromProps、getSnapshotBeforeUpdate来代替弃用的三个钩子函数(componentWillMount、componentWillReceiveProps,componentWillUpdate)
- React16并没有删除这三个钩子函数,但是不能和新增的钩子函数(getDerivedStateFromProps、getSnapshotBeforeUpdate)混用,React17将会删除componentWillMount、componentWillReceiveProps,componentWillUpdate
- 新增了对错误的处理(componentDidCatch)