React的生命周期分为两种情况,一种是16.3版本前的,还有一种是16.3版本后的,本着早写晚写都要写的原则,今天先写一下16.3版本前的版本,也就是网络上很流行的那张网图的版本:
第一种生命周期
依次介绍各个阶段:
- Initialization:初始化阶段
- 检查组件中是否含有默认属性,是否有属性校验
- Mounting:挂载阶段
- constructor:构造函数,它是React生命周期的一部分,,在这里面定义各种state,以及要绑定的函数
- componentWillMount:此时页面即将挂载到页面了(类似beforeMount),React官方不推荐在这里发送AJAX请求,在这里也可以进行一些setState的操作。
- render:执行render函数渲染页面,主要做一些数据渲染,展示。这里不能调用setState,因为setState会再次render页面,从而又一次render到了函数内,发现了setState,如此往复,陷入死循环。
- componentDidMount:此时函数已经被挂载到了页面中。在这里可以进行发送AJAX,setState等个各种对页面的操作
- Updation:更新阶段
- componentWillReceiveProps:在组件接收到新的Props前被调用,基本上没啥作用。这是只针对props单独写的生命周期函数
- shouldComponentUpdate:判断组件是否需要被更新,它会接受两个参数,nextProps,nextStates,这个生命周期函数需要返回一个boolean值,默认是true,如果返回值为false,那么不更新
- componentWillUpdate:组件更新前被调用,这里也不能使用setState,此时会回到showComponentUpdate的死循环中。基本上没啥用
- render:同Monuting阶段的render
- componentDidUpdate:告知组件更新并渲染完毕,此时更新完的组件已经渲染到页面。此时也不能设置ajax和setState。(这个生命周期中的大坑,当时我就在这里面写过,导致整个功能无法运行)
- Unmounting:卸载阶段
- componentWillUnmount:组件销毁时候调用,此时可以在这里销毁各种诸如定时器等需要销毁的函数
第二种生命周期
相比于16.3版本之前的生命周期,新的生命周期将所有的will的生命周期都删除了个干净,此外新加了getDerviedStateFromProps和getSnapshotBeforeUpdate。
- getDerviedStateFromProps
- 触发时间:组件每次被render的时候,包括在组件构建之后(虚拟dom之后,实际dom挂载之前),每次获取新的props或state之后。
- 每次接收一个新的props之后都会返回一个对象作为新的state,返回null则说不需要更新
- 这是个静态方法,所以没有this
- getSnapshotBeforeUpdate
- 触发时间:update发生的时候,在render之后,组件的dom被渲染之前
- 返回一个值,作为componentDidUpdate的第三个参数 如此我们把目前所有的生命周期都理一遍: 目前react生命周期总共分为三个部分:挂载阶段,更新阶段,卸载阶段:
- 挂载阶段:
- constructor:实例化阶段,在里面设置各种state,function
- getDeriverdStateFromProps:从props中获取state
- render:渲染整个组件
- componentDidMount:挂载完成,可以在这个上面写各种请求
- 更新阶段:
- getDeriverdStateFromProps:从props中获取state
- shouldComponentUpdate:判断组件是否需要重新渲染
- render:渲染整个组件
- getSnapshotBeforeUpdate:获取渲染前的样子,作为componentDidUpdate的第三个参数
- componentDidUpdate:组件更新完毕
- 卸载阶段:
- componentWillUnmount:组件卸载前调用
- 错误处理:
- getDerviedtateFromError:从错误中获取state
- componentDidCatch:捕获错误并进行处理