React的生命周期

340 阅读3分钟

React的生命周期分为两种情况,一种是16.3版本前的,还有一种是16.3版本后的,本着早写晚写都要写的原则,今天先写一下16.3版本前的版本,也就是网络上很流行的那张网图的版本:

第一种生命周期

image.png 依次介绍各个阶段:

  • 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:组件销毁时候调用,此时可以在这里销毁各种诸如定时器等需要销毁的函数

第二种生命周期

image.png 相比于16.3版本之前的生命周期,新的生命周期将所有的will的生命周期都删除了个干净,此外新加了getDerviedStateFromProps和getSnapshotBeforeUpdate。

  • getDerviedStateFromProps
    • 触发时间:组件每次被render的时候,包括在组件构建之后(虚拟dom之后,实际dom挂载之前),每次获取新的props或state之后。
    • 每次接收一个新的props之后都会返回一个对象作为新的state,返回null则说不需要更新
    • 这是个静态方法,所以没有this
  • getSnapshotBeforeUpdate
    • 触发时间:update发生的时候,在render之后,组件的dom被渲染之前
    • 返回一个值,作为componentDidUpdate的第三个参数 如此我们把目前所有的生命周期都理一遍: 目前react生命周期总共分为三个部分:挂载阶段,更新阶段,卸载阶段:
  1. 挂载阶段:
    • constructor:实例化阶段,在里面设置各种state,function
    • getDeriverdStateFromProps:从props中获取state
    • render:渲染整个组件
    • componentDidMount:挂载完成,可以在这个上面写各种请求
  2. 更新阶段:
    • getDeriverdStateFromProps:从props中获取state
    • shouldComponentUpdate:判断组件是否需要重新渲染
    • render:渲染整个组件
    • getSnapshotBeforeUpdate:获取渲染前的样子,作为componentDidUpdate的第三个参数
    • componentDidUpdate:组件更新完毕
  3. 卸载阶段:
    • componentWillUnmount:组件卸载前调用
  4. 错误处理:
    • getDerviedtateFromError:从错误中获取state
    • componentDidCatch:捕获错误并进行处理