大老刘 發表於 2019-11-13 19:18:00

React 新版生命周期

<p></p>
<div>React 16之后有三个生命周期被废弃(但并未删除)</div>
<ul>
<li>componentWillMount</li>
<li>componentWillReceiveProps</li>
<li>componentWillUpdate</li>
</ul>
<div>&nbsp;</div>
<div>官方计划在17版本完全删除这三个函数,只保留UNSAVE_前缀的三个函数,目的是为了向下兼容,但是对于开发者而言应该尽量避免使用他们,而是使用新增的生命周期函数替代它们。</div>
<div>&nbsp;</div>
<div>目前React 16.8 +的生命周期分为三个阶段,分别是挂载阶段、更新阶段、卸载阶段。</div>
<div>&nbsp;</div>
<div>挂载阶段:</div>
<ul>
<li>constructor: 构造函数,最先被执行,我们通常在构造函数里初始化state对象或者给自定义方法绑定this</li>
<li>getDerivedStateFromProps: <span style="color: rgba(255, 0, 0, 1)">static getDerivedStateFromProps(nextProps, prevState)</span>,这是个静态方法,当我们接收到新的属性想去修改我们state,可以使用getDerivedStateFromProps</li>
<li>render: render函数是纯函数,只返回需要渲染的东西,不应该包含其它的业务逻辑,可以返回原生的DOM、React组件、Fragment、Portals、字符串和数字、Boolean和null等内容</li>
<li>componentDidMount: 组件装载之后调用,此时我们可以获取到DOM节点并操作,比如对canvas,svg的操作,服务器请求,订阅都可以写在这个里面,但是记得在componentWillUnmount中取消订阅</li>
</ul>
<div>&nbsp;</div>
<div>更新阶段:</div>
<ul>
<li>getDerivedStateFromProps: 此方法在更新个挂载阶段都可能会调用</li>
<li>shouldComponentUpdate: <span style="color: rgba(255, 0, 0, 1)">shouldComponentUpdate(nextProps, nextState)</span>,有两个参数nextProps和nextState,表示新的属性和变化之后的state,返回一个布尔值,true表示会触发重新渲染,false表示不会触发重新渲染,默认返回true,我们通常利用此生命周期来优化React程序性能</li>
<li>render: 更新阶段也会触发此生命周期</li>
<li>getSnapshotBeforeUpdate: <span style="color: rgba(255, 0, 0, 1)">getSnapshotBeforeUpdate(prevProps, prevState)</span>,这个方法在render之后,componentDidUpdate之前调用,有两个参数prevProps和prevState,表示之前的属性和之前的state,这个函数有一个返回值,会作为第三个参数传给componentDidUpdate,如果你不想要返回值,可以返回null,此生命周期必须与componentDidUpdate搭配使用</li>
<li>componentDidUpdate: <span style="color: rgba(255, 0, 0, 1)">componentDidUpdate(prevProps, prevState, snapshot)</span>,该方法在getSnapshotBeforeUpdate方法之后被调用,有三个参数prevProps,prevState,snapshot,表示之前的props,之前的state,和snapshot。第三个参数是getSnapshotBeforeUpdate返回的,如果触发某些回调函数时需要用到 DOM 元素的状态,则将对比或计算的过程迁移至 getSnapshotBeforeUpdate,然后在 componentDidUpdate 中统一触发回调或更新状态。</li>
</ul>
<div>&nbsp;</div>
<div>卸载阶段:</div>
<ul>
<li>componentWillUnmount: 会在组件卸载及销毁之前直接调用。在此方法中执行必要的清理操作,例如,清除定时器,取消网络请求或清除在&nbsp;<code class="gatsby-code-text">componentDidMount()</code>&nbsp;中创建的订阅,清理无效的DOM元素等垃圾清理工作。</li>
</ul>
<p>&nbsp;</p>
<p>异常处理:</p>
<p>&nbsp;</p>
<div>
<ul>
<li>static&nbsp;getDerivedStateFromError:&nbsp;此生命周期会在渲染阶段后代组件抛出错误后被调用。&nbsp;它将抛出的错误作为参数,并返回一个值以更新&nbsp;state。<br><br></li>
<li>componentDidCatch:此生命周期在后代组件抛出错误后被调用。&nbsp;它接收两个参数:1.&nbsp;error&nbsp;——&nbsp;抛出的错误。2.&nbsp;info&nbsp;——&nbsp;带有&nbsp;componentStack&nbsp;key&nbsp;的对象,其中包含有关组件引发错误的栈信息。componentDidCatch 会在“提交”阶段被调用,因此允许执行副作用。&nbsp;它应该用于记录错误之类的情况。
<div>
<br><br></div>

</li>

</ul>

&nbsp;&nbsp;</div>
<p>参考:React 官方文档</p><br><br>
来源:https://www.cnblogs.com/cmyoung/p/11851983.html
頁: [1]
查看完整版本: React 新版生命周期