React 错误边界

什么是错误边界

错误边界是一种特殊的组件,能够用来捕获并打印发生在其子组件树任何位置的JavaScript错误,并渲染出备用UI。
错误边界会在渲染期间声明周期方法,和整组件树的构造函数中捕获错误。因此错误边界没法捕获如下场景中产生的错误:react

  • 事件处理
  • 异步代码
  • 服务端渲染
  • 自身抛出来的错误

错误边界相似于JavaScript的catch,可是它只针对react服务器

为何要用错误边界

错误边界能够解决部分UI的JavaScript错误会致使整个应用崩溃的问题。
自 React 16 起,任何未被错误边界捕获的错误将会致使整个 React 组件树被卸载,使用错误边界能够提供更好的用户体验异步

怎么使用

基础用法

在class组件中定义static getDerivedStateFromError()componentDidCatch()着两个声明周期方法中的任意一个(或两个),该组件就成为了一个错误边界。函数

  • getDerivedStateFromError() 用来处理错误
  • 使用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>

错误边界能够搭配错误监控来记录生产环境产生的错误this

何时,什么地点用

在任意react组件外来包裹错误边界,以保护边界外的内容不崩溃spa

相关知识

  • 在开发环境下React16会将渲染期间发生的全部错误打印到控制台,而且还提供了组件栈追踪:

Error caught by Error Boundary component

  • try/catch

try / catch 仅能用于命令式代码(imperative code),可是react组件是声明式的,因此须要错误边界来捕捉错误日志

相关文章
相关标签/搜索