React Router v7 中的 `ErrorBoundary` 详解

🛡️ 什么是 ErrorBoundary?

ErrorBoundary 是 React Router v7 中的错误边界组件,它会在以下情况下自动被调用:

  1. 路由加载失败 (loader 函数抛出错误)
  2. 组件渲染错误 (React 组件抛出异常)
  3. Action 执行失败 (action 函数抛出错误)
  4. 404 错误 (路由不存在)
  5. 其他 HTTP 错误 (如 500、403 等)

🔄 ErrorBoundary 的工作流程

让我用图表展示 ErrorBoundary 在应用中的位置:

📋 ErrorBoundary 的错误处理逻辑

jsx 复制代码
export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
  let message = "Oops!";
  let details = "An unexpected error occurred.";
  let stack: string | undefined;

  if (isRouteErrorResponse(error)) {
    message = error.status === 404 ? "404" : "Error";
    details =
      error.status === 404
        ? "The requested page could not be found."
        : error.statusText || details;
  } else if (import.meta.env.DEV && error && error instanceof Error) {
    details = error.message;
    stack = error.stack;
  }

  return (
    <main className="pt-16 p-4 container mx-auto">
      <h1>{message}</h1>
      <p>{details}</p>
      {stack && (
        <pre className="w-full p-4 overflow-x-auto">
          <code>{stack}</code>
        </pre>
      )}
    </main>
  );
}

🎯 错误类型处理

  1. 路由响应错误 (isRouteErrorResponse(error))

    • 404 错误:显示 "页面未找到"
    • 其他 HTTP 错误:显示状态文本
  2. 开发环境的 JavaScript 错误

    • 显示错误消息和堆栈跟踪
    • 仅在开发模式下显示详细信息
  3. 通用错误

    • 显示通用错误消息

📚 ErrorBoundary 总结

🎯 ErrorBoundary 的核心作用

  1. 全局错误捕获 - 捕获整个应用中的未处理错误
  2. 用户友好的错误显示 - 显示友好的错误页面而不是白屏
  3. 开发调试支持 - 在开发模式下显示详细的错误信息
  4. 应用稳定性 - 防止单个错误导致整个应用崩溃

🔄 与 Layout 的关系

jsx 复制代码
// 渲染层次:
Layout({ children: ErrorBoundary }) // 当有错误时
  └── ErrorBoundary({ error }) 
      └── 错误页面内容

// 正常情况:
Layout({ children: App }) // 正常情况
  └── App() 
      └── <Outlet /> 
          └── 正常页面组件

🛠️ 自定义 ErrorBoundary

你可以根据不同的错误类型提供不同的处理:

  • 404 错误 - 显示 "页面未找到"
  • 500 错误 - 显示 "服务器错误"
  • 网络错误 - 显示 "网络连接问题"
  • 权限错误 - 显示 "访问被拒绝"

ErrorBoundary 是 React Router v7 提供的强大错误处理机制,确保你的应用即使在出现错误时也能保持良好的用户体验。

相关推荐
前端摸鱼匠1 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker1 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding3 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马3 小时前
Raku正则匹配与数据批量处理实操案例
前端
nbwenren3 小时前
2026实测:Gemini 3 镜像站视觉能力实践——拍照原型图,一键生成 HTML+CSS 代码
前端·css·html
Lee川3 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
jinanwuhuaguo3 小时前
(第二十九篇)OpenClaw 实时与具身的跃迁——从异步孤岛到数字世界的“原住民”
前端·网络·人工智能·重构·openclaw
广州华水科技3 小时前
深度测评2026年单北斗GNSS位移监测系统推荐,与高口碑变形监测设备一同引领行业新风尚
前端
Alice-YUE4 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript