react 组件进阶之Error Boundaries(错误边界)

简介: 错误边界: 用来捕捉错误的代码,说到捕捉错误。大家可能都会说 直接try catch 不就行了。对的,try catch 确实是一种在各个语言比较通用的方法。但是在react 组件中,如果某一个组件发生错误,他是会往他的父级组件抛出错误的,然后自己是会被卸载的。如果到跟组件都不能够处理错误,这个组件树就会被卸载,组件树卸载导致的页面效果就是直接的报错。

含义


错误边界: 用来捕捉错误的代码,说到捕捉错误。大家可能都会说 直接try catch 不就行了。对的,try catch 确实是一种在各个语言比较通用的方法。但是在react 组件中,如果某一个组件发生错误,他是会往他的父级组件抛出错误的,然后自己是会被卸载的。如果到跟组件都不能够处理错误,这个组件树就会被卸载,组件树卸载导致的页面效果就是直接的报错。


默认情况下,若一个组件在渲染期间(render)发生错误,会导致整个组件树全部被卸载


错误边界:是一个组件,该组件会捕获到渲染期间(render)子组件发生的错误,并有能力阻止错误继续传播,防止组件树卸载,导致页面啥也没有


使用方式


让某个组件捕获错误


方式一: getDerivedStateFromError


1.编写生命周期函数 getDerivedStateFromError

  1.静态函数

  2.运行时间点:渲染子组件的过程中,发生错误之后,在更新页面之前

  3.注意:只有子组件发生错误,才会运行该函数

  4.该函数返回一个对象,React会将该对象的属性覆盖掉当前组件的state,使用的是混合,可以理解使用this.setState({})

  5.参数:错误对象

  6.通常,该函数用于改变状态


样例代码


import React, { ComponentClass, PureComponent } from 'react'
// 捕捉错误的状态
interface IGetErrorCompS {
  // 是否有错误
  hasError: boolean,
}
interface IProp {
  // 传入的组件
  children: JSX.Element
}
/**
 * 捕捉错误的组件
 */
class GetErrorComp extends PureComponent<IProp, IGetErrorCompS> {
  state = {
    hasError: false
  }
  /**
   * 该方法的执行时间是在子组件发生错误后,更新页面前触发的,返回一个对象来更新状态
   * @returns 
   */
  static getDerivedStateFromError() {
    console.log('我是组件GetErrorComp组件,来捕捉我子组件的错误');
    return {
      hasError: true
    }
  }
  render() {
    return (
      <>
        {this.state.hasError ? '我捕捉到子组件的错误' : this.props.children}
      </>
    )
  }
}
/**
 * 组件A
 */
class CompA extends PureComponent {
  render() {
    return (
      <>
        <h1>我是组件CompA</h1>
        <GetErrorComp>
          <CompB />
        </GetErrorComp>
      </>
    )
  }
}
/**
 * 组件B
 */
class CompB extends PureComponent {
  render() {
    throw Error('我是CompB组件,我要报错')
    return (
      <>
        <h1>我是组件CompB</h1>
      </>
    )
  }
}
/**
 * 测试边界组件
 */
export default class TestCompErrorBoundary extends PureComponent {
  render() {
    return (
      <div>
        <h1>我是跟组件</h1>
        <CompA />
      </div>
    )
  }
}


效果


20210314200509452.png


20210314200601295.png


方式二:componentDidCatch


2.编写生命周期函数 componentDidCatch

  1.实例方法

  2.运行时间点:渲染子组件的过程中,发生错误,更新页面之后,由于其运行时间点比较靠后,因此不太会在该函数中改变状态

  3.通常,该函数用于记录错误消息


代码修改


20210314201158583.png


效果


2021031420100834.png


20210314201032568.png


注意细节


某些错误,错误边界组件无法捕获


1.自身的错误

2.异步的错误

3.事件中的错误


总结:错误边界仅处理渲染子组件期间的同步错误

相关文章
|
6月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
120 0
|
22天前
|
前端开发 JavaScript 测试技术
React 错误边界 (Error Boundaries) 详解
【10月更文挑战第17天】在现代前端开发中,React 通过“错误边界”机制提高了应用的健壮性和用户体验。错误边界是一种特殊的 React 组件,能捕获并处理其子组件树中的 JavaScript 错误,防止应用因局部错误而整体崩溃。创建错误边界需实现 `static getDerivedStateFromError` 和 `componentDidCatch` 方法,分别用于更新状态和记录错误。正确使用错误边界,可以有效提升应用的稳定性和用户满意度。
116 62
|
4月前
|
存储 前端开发 JavaScript
react hooks 学习进阶
【7月更文挑战第12天】 React Hooks(自16.8版起)让函数组件能处理状态和副作用。useState用于添加状态管理,useEffect处理副作用,useContext共享数据,useReducer处理复杂状态逻辑,useRef获取引用。进阶技巧涉及性能优化,如useMemo和useCallback,以及遵循规则避免在不适当位置调用Hooks。理解异步更新机制和结合Redux等库提升应用复杂性管理。持续学习新技巧是关键。
54 0
|
6月前
|
前端开发 中间件 数据安全/隐私保护
React路由进阶方法
React路由进阶方法
58 1
|
6月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
52 1
|
6月前
|
前端开发 JavaScript API
React组件生命周期
React组件生命周期
119 1
|
6月前
|
存储 前端开发 JavaScript
探索 React Hooks 的世界:如何构建出色的组件(下)
探索 React Hooks 的世界:如何构建出色的组件(下)
探索 React Hooks 的世界:如何构建出色的组件(下)
|
6月前
|
缓存 前端开发 API
探索 React Hooks 的世界:如何构建出色的组件(上)
探索 React Hooks 的世界:如何构建出色的组件(上)
探索 React Hooks 的世界:如何构建出色的组件(上)
|
6月前
|
前端开发 应用服务中间件 数据库
react服务端组件
react服务端组件
52 0
|
6月前
|
前端开发 JavaScript
快速上手React:从概述到组件与事件处理
快速上手React:从概述到组件与事件处理