React错误边界

什么是错误边界(Error Boundaries)

部分 UI 的 JavaScript 错误不应该导致整个应用崩溃,为了解决这个问题,React 16 引入了一个新的概念 —— 错误边界。
需要知道的是错误边界是一种 React 组件,可以捕获并打印发生在其子组件树任何位置的 JavaScript 错误,并渲染出备用 UI,而不是渲染那些崩溃了的子组件树。错误边界在渲染期间、生命周期方法和整个组件树的构造函数中捕获错误。

错误边界无法捕获错误的场景

  • 事件处理(因为事件处理器不会在渲染期间触发,所以如果需要在事件处理器内部捕获错误,可以使用JavaScript try / catch 语句)
  • 异步代码(例如 setTimeoutrequestAnimationFrame 回调函数)
  • 服务端渲染
  • 它自身抛出来的错误(并非它的子组件)

如何实现错误边界

如果一个 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; 
  }
}

可以将错误边界作为一个常规组件去使用。只有 class 组件才可以成为错误边界组件。大多数情况下, 你只需要声明一次错误边界组件, 并在整个应用中使用它。错误边界的工作方式类似于 JavaScript 的 catch {},如果一个错误边界无法渲染错误信息,则错误会冒泡至最近的上层错误边界。

<ErrorBoundary>
  <MyWidget />
</ErrorBoundary>

错误边界的使用

可以将其包装在最顶层的路由组件并为用户展示一个 “Something went wrong” 的错误信息,也可以将单独的部件包装在错误边界以保护应用其他部分不崩溃。

自 React 16 起,任何未被错误边界捕获的错误将会导致整个 React 组件树被卸载。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容