I can make a class an error boundary in React by implementing componentDidCatch
.
Is there a clean approach to making a functional component into an error bo
As of v16.2.0, there's no way to turn a functional component into an error boundary.
The React docs are clear about that, although you're free to reuse them as many times as you wish:
The
componentDidCatch()
method works like a JavaScriptcatch {}
block, but for components. Only class components can be error boundaries. In practice, most of the time you’ll want to declare an error boundary component once and use it throughout your application.
Also bear in mind that try/catch
blocks won't work on all cases.
If a component deep in the hierarchy tries to updates and fails, the try/catch
block in one of the parents won't work -- because it isn't necessarily updating together with the child.
There is an implementation that can handle with non-existent functionalities for a functional component such as componentDidCatch
and deriveStateFromError
.
According to the author, it is based on React.memo().
The proposed solution is greatly inspired by the new React.memo() API.
import Catch from "./functional-error-boundary"
type Props = {
children: React.ReactNode
}
const MyErrorBoundary = Catch(function MyErrorBoundary(props: Props, error?: Error) {
if (error) {
return (
<div className="error-screen">
<h2>An error has occured</h2>
<h4>{error.message}</h4>
</div>
)
} else {
return <React.Fragment>{props.children}</React.Fragment>
}
})
reference and API here