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