1. エラーメッセージを確認する
React アプリでエラーが発生した場合、まず最初にブラウザのコンソール(F12 を押して DevTools を開く)でエラーメッセージを確認しましょう。エラーメッセージには、問題の原因や発生箇所のヒントが含まれています。
2. よくあるエラーとその対処方法
(1) Module not found エラー
原因: 必要なモジュールがインストールされていない、または import 文のパスが間違っている。
対応方法:
npm install または yarn install で依存関係を再インストールする。
import 文のパスが正しいか確認する。
package.json に該当モジュールが記載されているか確認する。
コード例:
import MyComponent from './MyComponent'; // パスが正しいか確認
(2) Cannot read properties of undefined エラー
原因: オブジェクトが undefined の状態でプロパティにアクセスしようとしている。
対応方法:
データが非同期で取得される場合、? オペレーター(オプショナルチェーン)を使用する。
if 文で undefined チェックを追加する。
useEffect フックを使用してデータの取得タイミングを適切に調整する。
コード例:
const user = data?.user; // オプショナルチェーンを使用
(3) Invalid Hook Call エラー
原因: フックが誤った場所で使用されている(例: クラスコンポーネント内で useState を使用した)。
対応方法:
フックは関数コンポーネントまたはカスタムフック内でのみ使用する。
React のバージョンが正しいか確認する。
コード例:
function MyComponent() {
const [count, setCount] = useState(0); // フックは関数コンポーネント内で使用
return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
(4) Unhandled Promise Rejection エラー
原因: async/await でエラーハンドリングを行っていない。
対応方法:
try/catch ブロックを使用してエラーをキャッチする。
catch メソッドを使用して .then() チェーン内でエラーハンドリングを行う。
コード例:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
3. デバッガーと React Developer Tools を活用する
(1) デバッガーの活用
debugger; ステートメントをコードに追加することで、ブラウザの DevTools でブレークポイントを設定できます。
Chrome DevTools を使用して JavaScript のステップ実行を行い、変数の値を確認しましょう。
コード例:
function testFunction() {
let value = 10;
debugger; // ここでコードの実行が一時停止
console.log(value);
}
(2) React Developer Tools の活用
React Developer Tools を Chrome または Firefox にインストールすると、React コンポーネントの状態やプロパティを直接確認できます。
Components タブでは、各コンポーネントの props や state の値をリアルタイムで変更してデバッグできます。
Profiler タブを使うと、レンダリングのパフォーマンスを分析し、最適化のポイントを特定できます。
4. エラーを防ぐためのベストプラクティス
型チェックを活用する
TypeScript を使用することで、未定義の変数や型エラーを事前に防ぐことができる。
エラーハンドリングを組み込む
try/catch を適切に使用し、エラーメッセージをユーザーに分かりやすく表示する。
エラーバウンダリーを活用する
componentDidCatch を使ってエラーハンドリングを行う。
ErrorBoundary コンポーネントを作成して、アプリがクラッシュしないようにする。
コード例:
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
console.error('Error caught:', error, errorInfo);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
5. まとめ
React のエラーは、適切なエラーメッセージの確認と、正しいエラーハンドリングの実装によって解決できます。特に、非同期処理のエラーやフックの使い方には注意し、TypeScript やエラーバウンダリーを活用することで、より安全なアプリ開発が可能になります。また、デバッガーや React Developer Tools を活用すると、より効果的にエラーを特定し、迅速に修正できます。