こんにちは!アミットです👨💻
Reactでアプリを作っていると、**突然画面が真っ白に…**そんな経験ありませんか?
それ、もしかして**「Error Boundary」**があれば防げたかも!
今回は、「Reactでアプリがクラッシュしない仕組み」=Error Boundary(エラーバウンダリ)
について、図解と実例コードでやさしく解説します!
🧠 なぜ Error Boundary が必要なの?
Reactでは、レンダリング中に子コンポーネントでエラーが起きると、親もろともアプリ全体が落ちることがあります。
❌ 1つの小さなミスで、画面全体が真っ白に…
これを防ぐのが Error Boundary
。
ざっくり言うと、「エラーを検知して、代わりのUIを表示する防波堤」 です。
💡 Error Boundaryって何者?
React公式によると:
エラーバウンダリとは、JavaScriptエラーをキャッチして代替UIを表示する特別なクラスコンポーネントです。
✅ 特徴まとめ
- クラスコンポーネントでしか使えない(Hooksでは未対応)
- 対象は子コンポーネントのエラーのみ
- エラーが起きたらアプリ全体がクラッシュせず、代替UIを表示
📦 最小構成の Error Boundary を作ってみよう
import React from "react";
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// 次のレンダリングでフォールバックUIを表示
return { hasError: true };
}
componentDidCatch(error, info) {
// エラーのログを外部サービスなどに送ることも可能
console.error("❗エラーが発生しました:", error, info);
}
render() {
if (this.state.hasError) {
return <h2>⚠️ 何か問題が発生しました。</h2>;
}
return this.props.children;
}
}
export default ErrorBoundary;
🧪 実践:エラーを起こす子コンポーネントを囲ってみる
import React from "react";
import ErrorBoundary from "./ErrorBoundary";
const BuggyComponent = () => {
throw new Error("💣 バグが発生しました!");
};
const App = () => {
return (
<div>
<h1>React エラーバウンダリ デモ</h1>
<ErrorBoundary>
<BuggyComponent />
</ErrorBoundary>
</div>
);
};
export default App;
✅ 結果:BuggyComponent
が爆発しても、ErrorBoundary
がキャッチして画面は落ちません!
🎯 どんなときに使えばいいの?
- ダッシュボードなど複雑なUIのパーツごとにErrorBoundaryを分けて配置
- 外部ライブラリを使っていてエラーが起きる可能性があるとき
- ユーザーに安定した体験を提供したいとき(特にプロダクション環境)
🚧 Error Boundary がキャッチできない例
以下のようなエラーはキャッチ不可です:
例 | 理由 |
---|---|
イベントハンドラ内のエラー | try-catchで自前で処理が必要 |
非同期処理(Promise)内のエラー |
.catch() が必要 |
サーバーサイドレンダリング中のエラー | クライアントサイドでしか動かない |
useEffect 内の非同期エラー |
try-catch+.catch() で明示的に処理 |
🎁 おまけ:複数箇所に使うTips
<ErrorBoundary>
<Navbar />
</ErrorBoundary>
<ErrorBoundary>
<Dashboard />
</ErrorBoundary>
<ErrorBoundary>
<Footer />
</ErrorBoundary>
➡️ UIを「パーツ単位」で保護できます。
ある部分だけ落ちても、他は無事!
🏆 ベストプラクティスまとめ
✅ クラスコンポーネントで作る
✅ UIパーツ単位で囲う
✅ ログ収集サービス(例:Sentry)と連携する
✅ ユーザーにフレンドリーなエラーメッセージを表示する
📌 まとめ
項目 | 内容 |
---|---|
機能 | 子コンポーネントのエラーをキャッチし、フォールバックUIを表示 |
書き方 | クラスコンポーネントとして定義 |
使いどころ | 複雑なUI、外部ライブラリの利用、プロダクション環境 |
✍️ 最後に一言
Error Boundary
を使えば、「アプリ全体が真っ白になる恐怖」から解放されます!
これを使わないのは、エアバッグなしで車を運転するようなものかも…😅
💬 「使ったことがある」「他の使い方も知りたい」など、コメントでぜひ教えてください!
📚 公式リファレンスもチェック
👉 https://ja.reactjs.org/docs/error-boundaries.html
📌 Qiitaタグ案:
React
JavaScript
エラーハンドリング
初心者向け
フロントエンド