Appearance
错误边界
本节目标:理解“错误边界”的核心思路,并能把它用于实际开发或面试表达。 过去,组件内的
JavaScript错误会导致React的内部状态被破坏,并且在下一次渲染时 产生 可能无法追踪的 错误。这些错误基本上是由较早的其他代码(非React组件代码)错误引起的,但React并没有提供一种在组件中优雅处理这些错误的方式,也无法从错误中恢复。
错误边界(Error Boundaries) 部分 UI 的 JavaScript 错误不应该导致整个应用崩溃,为了解决这个问题,React 16 引入了一个新的概念 —— 错误边界。
错误边界是一种 React 组件,这种组件可以捕获并打印发生在其子组件树任何位置的 JavaScript 错误,并且,它会渲染出备用 UI,而不是渲染那些崩溃了的子组件树。错误边界在渲染期间、生命周期方法和整个组件树的构造函数中捕获错误。 注意 错误边界无法捕获以下场景中产生的错误:
- 事件处理(了解更多)
- 异步代码(例如
setTimeout或requestAnimationFrame回调函数) - 服务端渲染
- 它自身抛出来的错误(并非它的子组件)
如果一个 class 组件中定义了
static getDerivedStateFromError()或
componentDidCatch()这两个生命周期方法中的任意一个(或两个)时,那么它就变成一个错误边界。 当抛出错误后:
- 请使用
static getDerivedStateFromError()渲染备用UI; - 使用
componentDidCatch()打印错误信息。
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false
};
}
static getDerivedStateFromError(error) {
//更新 state 使下一次渲染能够显示降级后的
UI
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
//你同样可以将错误日志上报给服务器
logErrorToMyService(error, errorInfo);
}
render() {
if (this.state.hasError) {
//你可以自定义降级后的 UI 并渲染
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}然后你可以将它作为一个常规组件去使用:
<ErrorBoundary> <MyWidget /></ErrorBoundary>错误边界的工作方式类似于 JavaScript 的 catch {},不同的地方在于错误边界只针对 React 组件。只有 class 组件才可以成为错误边界组件。大多数情况下, 你只需要声明一次错误边界组件, 并在整个应用中使用它。 注意错误边界仅可以捕获其子组件的错误,它无法捕获其自身的错误。如果一个错误边界无法渲染错误信息,则错误会冒泡至最近的上层错误边界,这也类似于 JavaScript 中 catch {} 的工作机制。 查看使用
React 16componentDidCatch(error, info) 在子组件抛出错误的时候调用,主要接收两个参数: error:抛出的错误信息 info:带有组件错误栈的对象,包含了哪个组件引发的错误信息 该生命周期方法在 commit 阶段被调用的,因此允许进行副作用。示例:
错误边界只能捕获树中子组件的错误,不能捕获组件本身的错误 只能使用错误边界来捕获异常或者是从异常中恢复 不能将错误边界用于控制流程 > 来自
<https://react.docschina.org/docs/error-boundaries.html>