Skip to content

错误边界 ​

本节目标:理解“错误边界”的核心思路,并能把它用于实际开发或面试表达。 过去,组件内的 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 16

定义和使用错误边界的例子。

componentDidCatch(error, info) 在子组件抛出错误的时候调用,主要接收两个参数: error:抛出的错误信息 info:带有组件错误栈的对象,包含了哪个组件引发的错误信息 该生命周期方法在 commit 阶段被调用的,因此允许进行副作用。示例:

错误边界只能捕获树中子组件的错误,不能捕获组件本身的错误 只能使用错误边界来捕获异常或者是从异常中恢复 不能将错误边界用于控制流程 > 来自

 <https://react.docschina.org/docs/error-boundaries.html>

本站总访问 — 次