当前位置: 首页 > news >正文

React中的ErrorBoundary

文章目录

  • 前言
    • ✅ 一、使用类组件实现 ErrorBoundary(官方推荐方式)
      • 用法示例:
    • ✅ 二、用函数组件实现 ErrorBoundary(借助 Hook + `react-error-boundary` 库)
      • 1. 安装 `react-error-boundary`
      • 2. 使用 `ErrorBoundary` 组件(函数方式)
    • ✅ 三、手写 Hook 模拟捕获运行时异常(局限性较大)
    • ✅ 总结对比


前言

在 React 中,ErrorBoundary(错误边界)用于捕获子组件在 渲染期间生命周期方法中构造函数中 发生的错误,防止整个应用崩溃。

React 目前官方只支持使用 类组件 实现 ErrorBoundary,但你也可以使用 第三方库 或自定义 Hook 来用函数组件实现类似功能。


✅ 一、使用类组件实现 ErrorBoundary(官方推荐方式)

import React from 'react'type Props = {fallback: React.ReactNodechildren: React.ReactNode
}type State = {hasError: boolean
}class ErrorBoundary extends React.Component<Props, State> {state: State = { hasError: false }static getDerivedStateFromError(_: Error): State {return { hasError: true }}componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {console.error('Error caught by ErrorBoundary:', error, errorInfo)}render() {if (this.state.hasError) {return this.props.fallback}return this.props.children}
}export default ErrorBoundary

用法示例:

<ErrorBoundary fallback={<h2>Something went wrong.</h2>}><MyComponent />
</ErrorBoundary>

✅ 二、用函数组件实现 ErrorBoundary(借助 Hook + react-error-boundary 库)

React 本身不支持函数组件方式的 Error Boundary(因为没有生命周期 componentDidCatch),但我们可以借助 第三方库

1. 安装 react-error-boundary

npm install react-error-boundary

2. 使用 ErrorBoundary 组件(函数方式)

import { ErrorBoundary } from 'react-error-boundary'function ErrorFallback({ error }: { error: Error }) {return (<div role="alert"><p>Something went wrong:</p><pre>{error.message}</pre></div>)
}function App() {return (<ErrorBoundary FallbackComponent={ErrorFallback}><DangerousComponent /></ErrorBoundary>)
}

✅ 三、手写 Hook 模拟捕获运行时异常(局限性较大)

只能用于捕获异步或事件中的异常,不能替代 ErrorBoundary 对渲染错误的捕获能力

function useSafeExecute(callback: () => void) {try {callback()} catch (e) {console.error('Caught error in hook:', e)}
}

✅ 总结对比

方法支持渲染错误类型是否推荐
类组件 ErrorBoundary官方支持✅ 推荐
函数组件 + react-error-boundary第三方支持✅ 推荐
自己写 hook try/catch 包装非正式⚠️ 仅限逻辑错误

http://www.lryc.cn/news/576158.html

相关文章:

  • 【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南
  • 【CV数据集介绍-40】Cityscapes 数据集:助力自动驾驶的语义分割神器
  • 攻防世界-MISC-Cephalopod
  • gemini-cli 踩坑实录
  • ARM64 linux系统的一般执行过程
  • C++ 函数特性详解:默认参数、重载、引用与指针区别
  • Flutter 网络请求指南, 从 iOS 到 Flutter 的 Dio + Retrofit 组合
  • 《聊一聊ZXDoc》之汽车服务导向SOME/IP
  • 【k近邻】 K-Nearest Neighbors算法原理及流程
  • 在shell中直接调用使用R
  • 远眺科技工业园区数字孪生方案,如何实现智能管理升级?
  • 告别堡垒机和VPN!Teleport:下一代基础设施统一访问入口
  • CTP IC失效现象和失效原理分析
  • 利用python实现NBA数据可视化
  • np.concatenate
  • 【C/C++】C++26新特性前瞻:全面解析未来编程
  • ​​Oracle表空间全景指南:从扩容监控到碎片回收的终极实践​
  • 车载诊断架构--- 车载诊断中的引导式诊断
  • 人工智能-基础篇-3-什么是深度学习?(DL,卷积神经网络CNN,循环神经网络RNN,Transformer等)
  • 第六章 STM32内存管理
  • 学习接口自动化框架pytest有哪些好处?
  • 小程序 API 开发手册:从入门到高级应用一网打尽
  • C++学习之STL学习:vector的模拟实现
  • Java多线程与JUC
  • window显示驱动开发—DirectX 图形内核子系统(三)
  • RocketMQ 消息长轮询
  • 集群聊天服务器----CMake的使用
  • ServletConfig ServletContext
  • git add 报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf in position 42
  • 【Elasticsearch】Linux环境下安装Elasticsearch