[译]React高级话题之Error Boundaries

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

内容简介:本文为意译,翻译过程中掺杂本人的理解,如有误导,请放弃继续阅读。原文地址: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的崩溃。


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

查看所有标签

猜你喜欢:

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

计算机程序设计艺术:第4卷 第4册(双语版)

计算机程序设计艺术:第4卷 第4册(双语版)

Donald E.Knuth / 苏运霖 / 机械工业出版社 / 2007-4 / 42.00元

关于算法分析的这多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷组成了程序设计理论和实践的惟一的珍贵源泉,无数读者都赞扬Knuth的著作对个人的深远影响。科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员们已经成功地应用他的“菜谱式”的解到日常问题上,所有人都由于Knuth在书中所表现出的博学、清晰、精确和高度幽默而对他无比敬仰。   为开始后续各卷的写作并更......一起来看看 《计算机程序设计艺术:第4卷 第4册(双语版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具