📜  ReactJS (16) 中的错误边界是什么?

📅  最后修改于: 2022-05-13 01:56:47.183000             🧑  作者: Mango

ReactJS (16) 中的错误边界是什么?

渲染期间的运行时错误可能会使应用程序处于损坏状态。 React 基本上卸载了洞反应组件树。如果我们能在它们的任何地方发现错误,那就太好了 组件树,记录这些错误,并显示一个备用 UI。这是错误边界成为焦点的地方。实现一个或两个生命周期方法的类组件static getDerivedStateFromError() componentDidCatch()成为错误边界。静态 getDerivedStateFromError()用于在抛出错误后呈现回退 UI。 componentDidCatch()用于记录错误信息。

错误边界不会捕获以下错误:

  • 事件处理程序
  • 异步代码(例如 setTimeout 或网络请求)
  • 服务器端渲染
  • 在错误边界本身(而不是其子项)中引发的错误

让我们看一个不使用错误边界的例子。

创建反应应用程序:

第 1 步:使用以下命令创建一个 React 应用程序:

npx create-react-app error-boundary-demo

第 2 步:创建项目文件夹后,即error-boundary-demo ,使用以下命令移动到该文件夹:

cd error-boundary-demo

第 3 步:创建一个目录并将其命名为Component

mkdir Component

项目结构:它将如下所示。

第 4 步:在这一步中,我们将创建HeroViewar组件来打印英雄的名字。如果英雄的名字是'Joker' ,这个组件会抛出一个错误。创建HeroViewar.js Component目录中并写下以下代码。

HeroViewar.js
import React from 'react'
  
const HeroViewar = ({name}) => {
  
    // Throw an error if not hero
    if(name === "Joker")
        throw new Error("Not a Hero!")
    return(
        

{name}

    ) }    export default HeroViewar


App.js
import React from 'react'
import HeroViewar from './Component/HeroViewar'
  
const App = () => {
  return (
    <>
      
      
      
    
  )
}
  
export default App


ErrorBoundary.js
import React, { Component } from 'react'
  
class ErrorBoundary extends 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, errorInfo) {
  
        // You can also log the error to
        // an error reporting service
        console.log(error, errorInfo)
    }
  
    render() {
        if (this.state.hasError) {
  
          // You can render any custom fallback UI
          return 

Something went wrong!

        }             return this.props.children        } }    export default ErrorBoundary


App.js
import React from 'react'
import ErrorBoundary from './Component/ErrorBoundary'
import HeroViewar from './Component/HeroViewar'
  
const App = () => {
  return (
    <>
    
      
    
    
      
    
    
      
    
    
  )
}
  
export default App


第 5 步:在这一步中,我们将从HeroViewar.js 中导入 HeroViewar打印一些英雄的名字。将英雄的名字作为 prop 传递给HeroViewar组件。在App.js文件中写下以下代码。

应用程序.js

import React from 'react'
import HeroViewar from './Component/HeroViewar'
  
const App = () => {
  return (
    <>
      
      
      
    
  )
}
  
export default App

运行应用程序的步骤:从项目的根目录使用以下命令运行应用程序:

npm start

输出:

解释:我们的英雄名字之一是'Joker' ,这就是HeroViewar抛出错误的原因。如果您现在查看浏览器,您将看到整个应用程序崩溃。显然,这并不好。我们想要的是,如果某个特定组件抛出错误,那么只有该组件应该回退到 UI 中,而其余组件应该不受影响。

第 6 步:为了克服上述问题,React 16 引入了“错误边界”的新概念。错误边界在其组件树中的任何位置捕获错误,并显示回退 UI。让我们添加它。在Component目录中创建ErrorBoundary.js并记下以下代码。

错误边界.js

import React, { Component } from 'react'
  
class ErrorBoundary extends 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, errorInfo) {
  
        // You can also log the error to
        // an error reporting service
        console.log(error, errorInfo)
    }
  
    render() {
        if (this.state.hasError) {
  
          // You can render any custom fallback UI
          return 

Something went wrong!

        }             return this.props.children        } }    export default ErrorBoundary

第 7 步:更新App.js以使用ErrorBoundary包装每个HeroViewar ,例如:


    

将以下代码写入App.js

应用程序.js

import React from 'react'
import ErrorBoundary from './Component/ErrorBoundary'
import HeroViewar from './Component/HeroViewar'
  
const App = () => {
  return (
    <>
    
      
    
    
      
    
    
      
    
    
  )
}
  
export default App

输出: