React16新的生命周期

138 阅读4分钟

React16是一次比较大的更新,它里面新采用封装了fiber架构(fiber算法),这样的话性能更好了

Mounting(加载阶段(也就是实例化期):涉及4个钩子函数)

1、constructor(){}

加载的时候调用一次,可以初始化state

2、static getDerivedStateFromProps(newProps,Prevstate)

它代替了componentWillMount(){}钩子函数

作用:

  • 就是把props接收到的数据,存到state里。
  • 它也代替了componentWillReceiveProps方法,只不过这个方法里通过setState把props存进状态,新的周期里是返回一个对象。
  • 组件每次被render的时候,包括在组件构建之后(虚拟DOM之后,实际DOM挂在之前),每次获取新的props或state之后,每次接收新的props之后都会返回一个对象作为新的state,返回null则说明不需要更新state;配合componentDidUpdate,可以覆盖componentReceiveProps的所有用法。

用法:

必须有返回值,返回值必须是个对象。在里面不能用setState修改状态,返回值就是新的状态,用返回值把新的状态覆盖掉。它作为类的静态方法使用。这个是纯函数,也就是它的参数不可以在这里面改,也不可以获得随机数,所以它里面不能直接修改属性和state

参数:

  • props就是传递进来的props(新的props)
  • state是当前组件的状态(旧的状态)
  • 该函数也是在render调用之前最后一次修改state的状态,除了做这件事情以外,函数里什么都不能写。

3、render

该方法是React中最重要的步骤,创建虚拟DOM,进行diff算法,更新DOM树都在此进行

4、componentDidMount(){}

组件渲染之后调用,只调用一次

Updating(更新阶段(存在期):涉及5个钩子函数)

1、getDerivedStateFromProps(newProps,prevState)

当props和state发生变化,组件会更新,在更新阶段就会再调用一次

2、shouldComponentUpdate(nextProps,prevState)

组件接收到新的props或者state调用,return true就会更新DOM(使用diff算法更新),return false阻止更新(不调用render)

3、render

创建虚拟DOM。生成重新渲染之后的DOM树

4、getSnapshotBeforeUpdate(prevProps,prevState){}

触发时间:update发生的时候,在render之后,在组件dom渲染之前,返回一个值,作为componentDidUpdate的第三个参数,配合componentDidUpdate,可以覆盖componentWillUpdate的所有用法。 它本质上也是代替了componentWillUpdate,实现原来的功能,但是它被放在了render之后触发。用的也不是很多,记下来,了解就行

5、componentDidUpdate(){}

它与原来没有任何变化。组件加载阶段不调用,组件更新完成后调用。

卸载阶段(涉及1个钩子函数)

componentWillUnmount(){}

组件卸载时触发

componentDidCatch(error,info){}

  • 作用:程序运行中计算问题,或出现语法错误,都被它捕获到。只要组件里有错误,它就会触发,控制台里面报错输出的东西,就放在error里
  • 当子组件中抛出错误后,componentDidCatch就会触发,可以在这个方法里捕获错误、打印错误信息或上报错误信息等操作。

怎么远程获取到错误?

  • componentDidCatch(error,info){}就可以远程获取。上报错误

  • 其实就是把错误存到服务器里了。后台服务器会写一个接口

  • 变更原因原来(React v16.0前)的生命周期在React v16推出的Fiber之后就不合适了,因为如果要开启async rendering,在render函数之前的所有函数,都有可能被执行多次

  • "如果开发者开了async rendering,而且又在以上这些render前执行的生命周期方法做AJAX请求的话,那AJAX将被无谓地多次调用。而且在componentWillMount里发起AJAX,不管多快得到结果也赶不上首次render,而且componentWillMount在服务器端渲染也会被调用到,所以除了shouldComponentUpdate,其他在render函数之前的所有函数(componentWillMount,

  • componentWillReceiveProps,componentWillUpdate)都被getDerivedStateFromProps替代

  • ,也就是用一个静态函数getDerivedStateFromProps来取代被deprecate的几个生命周期函数,就是强制开发者在render之前只做无副作用的操作,而且能做的操作局限在根据props和state决定新的state