[译]React高级话题之Error Boundaries

栏目: IOS · Android · 发布时间: 6年前

内容简介:本文为意译,翻译过程中掺杂本人的理解,如有误导,请放弃继续阅读。原文地址:Error Boundaries在过去,React组件内部的javascript错误往往会让React内部的state变得不可用,并且会在下一次的渲染过程中产生模棱两可的错误信息。这些错误常常是由应用先前的错误所引起的,但是React并没有提供一个优雅的方案去在组件内部处理这种错误,并将应用恢复到正常的状态。

本文为意译,翻译过程中掺杂本人的理解,如有误导,请放弃继续阅读。

原文地址:Error Boundaries

在过去,React组件内部的javascript错误往往会让React内部的state变得不可用,并且会在下一次的渲染过程中产生模棱两可的错误信息。这些错误常常是由应用先前的错误所引起的,但是React并没有提供一个优雅的方案去在组件内部处理这种错误,并将应用恢复到正常的状态。

正文

介绍Error Boundaries

应用中局部UI中的javascript错误按理说不应该导致整个应用都崩溃掉。为了帮助React用户解决这种问题,React在16.x.x中引入了新的概念-“error boundary”。

什么是“error boundary”呢? “error boundary”就是一种能够捕获它的子组件树所产生的错误的React组件 。在这种组件里,你能够把这些错误日志打印出来,又或者相比简单粗暴地把组件树崩溃后的界面呈现给用户,你可以呈现一个精心设计过的备用界面给用户(为了强调error boundary是一个组件,我后面的翻译过程中使用 <Error boundary> 来指代)。 <Error boundary> 能捕获在渲染过程中,所有子组件的constructors和生命周期函数里面发生的错误。

<Error boundary> 不能捕获以下类型的错误:

<Error boundary>

从代码的层面来说,只要一个class component定义了 static getDerivedStateFromError()componentDidCatch() 方法中的一个,又或者两个都定义了,我们就说它是一个 <Error boundary> 。上面提到的两个方法其实是有分工的。一般来说, static getDerivedStateFromError() 是不允许发生副作用的,故是负责呈现一个备用的UI给用户。 componentDidCatch() 允许发生副作用,故负责打印错误日志,发送错误日志到远程服务器等。如下:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // You can also log the error to an error reporting service
    logErrorToMyService(error, info);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children; 
  }
}
复制代码

然后呢,你可以把它当做一个普通的组件来用:

<ErrorBoundary>
  <MyWidget />
</ErrorBoundary>
复制代码

<Error boundary> 使用起来就像 catch {} 语句,只不过它是用于React component而已。只有class component才能成为 <Error boundary> 。在实际应用中,大多数情况,你只需要定义一个 <Error boundary> ,然后到处使用它。

注意, <Error boundary> 是不能捕获自己所产生的错误,只能捕获在它之下的组件树所产生的错误。在 <Error boundary> 嵌套使用的情况下,如果某个 <Error boundary> 不能渲染一些错误信息(调用static getDerivedStateFromError()失败?),那么这个错误就会往上冒泡到层级最近的个 <Error boundary> 。这也是catch{}语句在javascript里面的执行机制。

在线Demo

查看 如何在React 16版本中定义和使用 error boundary

在哪里“放置”Error Boundaries

在组件树中“放置” <Error boundary> 的密度完全取决于你。你可以把你最顶级的route component包裹在 <Error boundary> 中,然后让 <Error boundary> 呈现一个备用的界面给用户,例如“Something went wrong”。服务端渲染经常就是这样应对应用崩溃的。你也可以把多个组件分开包裹在 <Error boundary> 中,以此来防止局部UI的崩溃。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML5

HTML5

Matthew David / Focal Press / 2010-07-29 / USD 39.95

Implement the powerful new multimedia and interactive capabilities offered by HTML5, including style control tools, illustration tools, video, audio, and rich media solutions. Understand how HTML5 is ......一起来看看 《HTML5》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试