这期内容当中小编将会给大家带来有关怎么在反应中处理错误边界组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
中反应的未捕获的JS错误会导致整个应用的崩溃,和整个组件树的卸载。从React16开始就是这样。但是同时反应也引入了一个新的概念——错误边界。
定义,是什么
错误边界仍然是一种组件,可以捕获(打印或者其他方式)处理该组件的子组件树任何位置的JavaScript错误,并根据需要渲染出备用UI。
工作方式类似于try - catch,但是错误边界只用于反应组件。
只有类组件能够成为错误边界组件。错误边界仅可以捕获子组件的错误,无法捕获自身的错误。
错误边界会在渲染期间,生命周期和整个组件树的构造函数中捕获错误。如果没有错误边界处理,渲染的还是崩溃的子组件树,这显然不是我们想要的。
通过一个例子来逐步演示要怎么用错误边界:
export default class ErrorTest extends Component { 构造函数才能(道具),{ ,,,超级(道具); ,,} 渲染才能(),{ ,,,return ( ,,,,,& lt; div> ,,,,,,,& lt; BugCounter> & lt;/BugCounter> ,,,,,,,& lt; span> my name is dan ,,,,,& lt;/div> ,,,); ,,} }//,Bug 报错组件 class BugCounter  extends Component  { 构造函数才能(道具),{ ,,,超级(道具); ,,,this.state =, { ,,,,,计数器:,0, ,,,}; ,,} click 才能=,(),=祝辞,{ ,,,this.setState (({}, counter ),=祝辞,({,计数器:counter +, 1,})); ,,}; 渲染才能(),{ ,,,if (===this.state.counter 5), { ,,,,,throw new 错误(“撞!“); ,,,} ,,,return ( ,,,,,& lt; div> ,,,,,,,& lt; h4 onClick={this.click}在{this.state.counter} & lt;/h4> ,,,,,& lt;/div> ,,,); ,,} }
上面代码的渲染结果(忽略样式):
点击数字<代码> 0 代码>,会逐步递增。但是数字等于<代码> 5> 代码的时候,组件会抛出一个<代码>错误代码>:
该误差<代码> 代码>会引起整个演示<代码> 代码>的崩溃,连外部的<代码> & lt; span>我叫dan 代码也显示不出来了,这时还没有添加错误边界。
生产模式下,会直接白屏,并在控制台报错:
<强> getDerivedStateFromError,componentDidCatch 强>
需要一个错误边界来处理这种崩溃。如何定义一个错误边界?
定义一个组件,并实现<代码>静态getDerivedStateFromError() 代码>或者<代码> componentDidCatch() 代码>生命周期方法(可以都实现或者选择其一)。这个组件就会变成一个错误边界。
关于这两个生命周期函数,可以通过链接查看,总结如下:
componentDidCatch(错误,,信息)
<代码> 代码>是错误抛出的错误对象,而<代码>信息> 代码则包含了组件引发错误的栈信息。函数在提交阶段被调用。是可以执行副作用的。
static getDerivedStateFromError(错误)
在子组件抛出错误后调用,会将抛出的错误作为参数。需要返回一个值,以更新状态。该函数在渲染阶段调用,不允许出现副作用。如果在捕获错误后需要执行副作用操作,应该在<代码> componentDidCatch> 代码中进行。
制作错误边界组件
可以使用组合的方式,在要使用的组件上面添加一个错误边界组件包裹一层。该组件需要这些效果:
- <李>
捕获子组件错误,组件内部记录出错状态
李> <李>在出错状态下显示备用UI,在正常状态下显示子组件
李>那么就可以像这样:
class ErrorBoundary extends React.Component { 构造函数才能(道具),{ ,,,超级(道具); ,,,this.state =, {, hasError: false }; ,,} static 才能;getDerivedStateFromError(错误),{ ,,,//,更新,state 使下一次渲染能够显示降级后的,UI ,,,return {, hasError: true }; ,,} componentDidCatch才能(错误,,errorInfo), { ,,,//,你同样可以将错误日志上报给服务器 ,,,logErrorToMyService(错误,,errorInfo); ,,} 渲染才能(),{ ,,,if (this.state.hasError), { ,,,,,//,你可以自定义降级后的,UI 并渲染 ,,,,,return & lt; h2> Something went 错误的。你们;/h2>; ,,,} ,,,return this.props.children;, ,,} }怎么在反应中处理错误边界组件