0.0.0.5
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
"use client"
|
||||
|
||||
import React from "react"
|
||||
|
||||
interface Props {
|
||||
children: React.ReactNode
|
||||
fallback?: React.ReactNode
|
||||
}
|
||||
|
||||
interface State {
|
||||
hasError: boolean
|
||||
error?: Error
|
||||
}
|
||||
|
||||
export class ErrorBoundary extends React.Component<Props, State> {
|
||||
constructor(props: Props) {
|
||||
super(props)
|
||||
this.state = { hasError: false }
|
||||
}
|
||||
|
||||
static getDerivedStateFromError(error: Error): State {
|
||||
return { hasError: true, error }
|
||||
}
|
||||
|
||||
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
|
||||
console.error("ErrorBoundary 捕获错误:", error, errorInfo)
|
||||
}
|
||||
|
||||
render() {
|
||||
if (this.state.hasError) {
|
||||
return (
|
||||
this.props.fallback || (
|
||||
<div className="p-4 border border-destructive rounded-lg bg-destructive/10">
|
||||
<h3 className="text-lg font-bold text-destructive mb-2">组件加载失败</h3>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{this.state.error?.message || "未知错误"}
|
||||
</p>
|
||||
<button
|
||||
className="mt-4 px-4 py-2 bg-primary text-primary-foreground rounded"
|
||||
onClick={() => this.setState({ hasError: false })}
|
||||
>
|
||||
重试
|
||||
</button>
|
||||
</div>
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
return this.props.children
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user