react-error-boundary の fallbackRender と FallbackComponent の違い
updated
2024/12/13
本文を大幅に修正。
react-error-bounadry
React ErrorBoundary は Class Component で実装する必要がある。 react-error-bounadry は React の ErrorBoundary を Functional Component で実装するためのライブラリである。
結論
fallbackRender と FallbackComponent で出来ることに違いはない。
fallbackRender は意図しない動作をすることがあるので FallbackComponent を使っておけばいい。
fallbackRender
react-error-boundary の fallbackRender を利用して、以下のように ErrorBoundary を実装できる。
import { ErrorBoundary } from "react-error-boundary";
<ErrorBoundary fallbackRender={() => <p>Error Boundary</p>}>
<SomeComponent />
</ErrorBoundary>;上記の <SomeComponent> で例外を throw すると fallbackRender に渡された関数(type '(props: FallbackProps) => ReactNode')を実行する。
以下のように直接 Functional Component に Component を渡すこともできる。
import { useEffect } from 'react';
import { ErrorBoundary } from "react-error-boundary";
function Fallback() {
return <p>Error Boundary</p>;
}
<ErrorBoundary fallbackRender={Fallback}>
<SomeComponent />
</ErrorBoundary>;ただし、上記の実装には制限があるので注意が必要なようだ。
例えば、以下のように FallbackProps を受け取る Fallback コンポーネントを実装した場合、
実行時エラーが発生し正常にレンダリングされなかった。
fallbackRender に直接 Fallback を渡しても型定義エラーは発生しないので分かりにくい。
import { FallbackProps } from "react-error-boundary";
export function Fallback({ error }: FallbackProps) {
...
}また、以下のように Hook を実装した場合にも同様に実行時エラーが発生した。
export function Fallback() {
useEffect(() => {
console.log("hi");
});fallbackRender を利用して FallbackProps と Hook を動作させる場合には以下のように実装する。
<ErrorBoundary fallbackRender={(props) => <Fallback {...props} />}>FallbackComponent
react-error-boundary には、fallbackRender とは別に FallbackComponent という Props が存在する。
FallbackComponent を利用して、以下のように ErrorBoundary を実装できる。
import { useEffect } from 'react';
import { ErrorBoundary, FallbackProps } from "react-error-boundary";
function Fallback({ error }: FallbackProps)) {
useEffect(() => {
console.log("hello");
}, []);
return <p>Error Boundary</p>;
}
<ErrorBoundary fallbackComponent={Fallback}>
<SomeComponent />
</ErrorBoundary>;fallbackRender とは異なり、FallbackComponent は上記の実装でも React の Hook や Context を利用できる。FallbackProps も上記の実装で扱うことができる。
したがって、FallbackComponent は fallbackRender より記述量が少なく済む。
追加の Props を渡すためには、以下のように実装する。この場合は fallbackRender と同じ。
<ErrorBoundary FallbackComponent={(props) => <Fallback {...props} text={"hoge"} />}>経緯
結局、fallbackRender と FallbackComponent で同じことが実現できるのに、なぜ react-error-boundary は 2 つの Props を定義したのだろうか。
Provide extra props to fallback component によると、FallbackComponent は Props として最初から存在していたことが分かる。
詳細は分からないが、Component に独自の Props を渡す上で、より適切な命名の Props として fallbackRender が実装されたという経緯のように解釈できた。
結論 (再掲)
命名を気にしなければ常に FallbackComponent を使うでも問題ないと思う。