React/Hooks/Lesson 09
useEffect
35分·theory
このチャプター
1/5
JavaScript
useEffect
💡 なぜ学ぶ必要があるのか?
🎯
サーバーからデータを取得する最も基本的な方法です。
💼
ページ読み込み時に一度だけ実行したり、特定の値が変わったときだけ実行したりする制御が可能です。
⚡
Reactデベロッパーであれば毎日使う必須機能です。
🏢 실무에서는
実務では、コンポーネントが画面に表示されると `useEffect` でAPIを呼び出し、商品一覧やユーザー情報などを取得します。ほぼすべてのウェブアプリがこのパターンで構築されています。
useEffect — コンポーネントのライフサイクル、APIコール/タイマーに使用
日常の比喩: 入退場アテンダント
コンポーネントが画面に表示されたとき(マウント)と消えたとき(アンマウント)に
自動的に実行されるコードを登録するHook。
なぜ学ぶのか?
- ▸データ読み込み(APIコール)
- ▸タイマーの設定
- ▸イベントリスナーの登録/解除
基本構造
依存配列のパターン
💡 ⚠️ よくある間違い
- ▸依存配列に必要な値を省略してESLintの警告を無視する(exhaustive-depsルール違反)
- ▸クリーンアップ関数なしで
setIntervalやaddEventListenerなどを使用してメモリリークが発生する - ▸
async/awaitをuseEffectのコールバックに直接使用する(useEffectはクリーンアップ関数のみを返す必要がある) - ▸オブジェクトや配列を依存関係として使用する際の参照等価性の問題で無限レンダリングが発生する
💡 🎯 面接対策
Q: useEffectの依存配列が空の配列[]の場合と、ない場合の違いを説明してください。
Q: useEffectでAPIコールを行う際、競合状態(Race Condition)をどのように防止できますか?
Q: useEffectのクリーンアップ関数はいつ実行され、なぜ必要なのですか?
ヒント: 依存配列の3つのパターン(なし/空配列/値あり)を明確に区別し、AbortControllerやcleanupフラグを使った競合状態の解決方法をコードとともに説明。メモリリーク防止のためのクリーンアップの重要性を実務事例を交えて回答する。
⚛️ Reactパターン — useEffect
useEffectをReactでどのように使うか、コードとともにステップごとに学んでいきましょう。
1
🎯
1. Effectの定義
レンダー後に実行する副作用
useEffect(() => {
console.log('マウントまたはcount変更');
}, [count]);
↓
2
📋
2. 依存配列
[] = 一度だけ、[x] = xが変わったとき、なし = 毎回
↓
3
🧹
3. クリーンアップ関数
returnでクリーンアップ関数を返す — アンマウント時に実行
useEffect(() => {
const t = setInterval(...);
return () => clearInterval(t); // cleanup
}, []);
↓
4
⚠️
4. よくある間違い
依存関係の漏れ → stale closure / 無限ループ
⏰ useEffect — マウント + 依存関係 + クリーンアップ
コードを直接編集すると0.7秒後に自動的に反映されます。React 18 + Babelでブラウザ上で即時実行。
🖥️ 実行結果 — レンダリングされたReactコンポーネント
✏️ React 코드 수정하기 (클릭해서 열기)
⚛️ React 18 + Babel Standalone — まず結果を確認し、エディタで自由に編集できます。
確認クイズ
useEffectの依存配列が`[]`(空の配列)のとき、実行タイミングはいつですか?
先に読むとよい概念: フォーム処理
次のおすすめ: useReducer — Redux の基盤