当前位置: 首页 > 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.lqws.cn/news/550027.html

相关文章:

  • 【经验】新版Chrome中Proxy SwitchyOmega2已实效,改为ZeroOmega
  • 车载诊断架构 --- 诊断与ECU平台工作说明书
  • SQL Server for Linux 如何实现高可用架构
  • 【策划所需编程知识】
  • 中国双非高校经费TOP榜数据分析
  • 【记录】Ubuntu|Ubuntu服务器挂载新的硬盘的流程(开机自动挂载)
  • SQL学习笔记4
  • MFC获取本机所有IP、局域网所有IP、本机和局域网可连接IP
  • 一起endpoint迷路的问题排查总结
  • 浅谈Apache HttpClient的相关配置和使用
  • git add 报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf in position 42
  • SOCKS 协议版本 5 (RFC 1928)
  • 【stm32】HAL库开发——CubeMX配置串口通讯(中断方式)
  • VUE使用过程中的碰到问题记录
  • 自动对焦技术助力TGV检测 半导体检测精度大突破
  • 工作台-02.代码开发
  • Linux信号机制:从入门到精通
  • [Python]-基础篇1- 从零开始的Python入门指南
  • 微调大语言模型(生成任务),怎么评估它到底“变好”了?
  • Python网安-zip文件暴力破解
  • Java:链接mysql数据库报错:CommunicationsException: Communications link failure
  • Coze API如何上传文件能得到文件的file_url
  • 缓解停车难的城市密码:4G地磁检测器如何重构车位资源分配
  • Discrete Audio Tokens: More Than a Survey
  • TensorRT-LLM的深度剖析:关键问题与核心局限性
  • Java-异常类
  • Spearman检验组间相关性及SCI风格绘图
  • MySQL之事务原理深度解析
  • [Python] -基础篇2-Python中的变量和数据类型详解
  • 运营医疗信息化建设的思路