import { ErrorInfo } from 'react' import { Result, Button, Collapse, Typography } from 'antd' import { BugOutlined, ReloadOutlined, HomeOutlined } from '@ant-design/icons' import { useNavigate } from 'react-router-dom' /** * 模块错误提示组件 * * @description * 当模块加载或运行出错时显示的友好错误页面 * 提供重试和返回首页的操作 * * @version Week 2 Day 7 - 任务17 */ const { Paragraph, Text } = Typography interface ModuleErrorFallbackProps { /** 错误对象 */ error: Error | null /** 错误详细信息 */ errorInfo?: ErrorInfo | null /** 重置错误状态的回调 */ onReset?: () => void /** 模块名称 */ moduleName?: string } const ModuleErrorFallback = ({ error, errorInfo, onReset, moduleName, }: ModuleErrorFallbackProps) => { const navigate = useNavigate() // 是否显示详细错误信息(开发环境显示,生产环境隐藏) const isDevelopment = import.meta.env.DEV /** * 处理重试 */ const handleRetry = () => { if (onReset) { onReset() } else { // 如果没有提供onReset,刷新页面 window.location.reload() } } /** * 返回首页 */ const handleGoHome = () => { navigate('/') } return (
} title={ {moduleName ? `${moduleName}模块` : '页面'}加载失败 } subTitle={
抱歉,模块加载时遇到了一些问题。这可能是由于网络问题或代码错误导致的。 您可以尝试重新加载,或者返回首页。如果问题持续存在,请联系技术支持。
} extra={
} /> {/* 开发环境:显示详细错误信息 */} {isDevelopment && error && (
🔧 开发模式:查看错误详情 ), children: (
{/* 错误消息 */}
错误消息: {error.toString()}
{/* 错误堆栈 */} {error.stack && (
错误堆栈: {error.stack}
)} {/* 组件堆栈 */} {errorInfo?.componentStack && (
组件堆栈: {errorInfo.componentStack}
)} {/* 时间戳 */}
错误时间:{new Date().toLocaleString('zh-CN')}
), }, ]} />
)} {/* 生产环境:错误ID提示 */} {!isDevelopment && (
错误ID: {Date.now().toString(36)}
如需技术支持,请提供此错误ID
)}
) } export default ModuleErrorFallback /** * 🎨 设计说明: * * 1. 用户体验: * - ✅ 友好的错误提示(不显示技术术语) * - ✅ 明确的操作指引(重试/返回首页) * - ✅ 视觉上与整体风格一致(Ant Design Result) * * 2. 开发体验: * - ✅ 开发环境显示详细错误(方便调试) * - ✅ 错误信息可复制(方便分享给团队) * - ✅ 显示完整堆栈(快速定位问题) * * 3. 生产环境: * - ✅ 隐藏技术细节(安全性) * - ✅ 提供错误ID(方便追踪) * - ✅ 引导用户联系支持 * * 4. 后续优化: * - [ ] 添加"反馈问题"按钮 * - [ ] 集成错误报告系统 * - [ ] 记录用户操作路径 * - [ ] 自动重试机制(网络错误) */