⚛️

React Hooks入門

Reactのコア機能であるHooksの仕組みを、useStateやuseEffectのライフサイクル、およびカスタムフックの作成まで体系的に学びます。

学習をスタートする

🗺️ ロードマップ

1

useState と useEffect のライフサイクル

React の機能である Hooks(フック) は、関数コンポーネントの中で状態管理や副作用(API通信、DOM操作など)を扱うための仕組みです。 第1章では、最も頻繁に使用される と を取り上げ、コンポーネントがどのように「レンダリング」され、「副作用が実行されるか」というライフサイクルの流れを図解で学びます。 1. useState による状態管理の基本 は、コンポーネント内に「状態(State)」を持たせるためのフックです。状態が更新されると、Reactはコンポーネントを再レンダリング(再描画)します。 * (状態変数): 現在保持されている値です。 * (更新関数): 値を更新するための関数です。これを使って値を変更すると、Reactに再レンダリングがトリガーされます。 2. useEffect のライフサイクルと実行タイミング は、レンダリング結果が画面に反映された「後」に実行される副作用(Side Effect)を定義します。 実行の流れ(ライフサイクル) 依存配列(Dependencies)による制御 の第2引数に渡す配列によって、実行タイミングを制御できます。 依存配列の指定 実行されるタイミング 指定なし () 毎回のレンダリング後 に常に実行される 空の配列 () 初回のマウント時(画面表示時)のみ 実行される 値あり () 初回マウント時 & の値が変わったときのみ 実行される 3. クリーンアップ関数(Cleanup)の重要性 内でイベントリスナーの登録やタイマーの設置()を行った場合、コンポーネントが消える(アンマウント)前や、次の副作用が実行される前に、それらを解除(クリーンアップ)する必要があります。 これを怠ると、メモリリーク や予期しないバグの原因になります。 クリーンアップの書き方 コンポーネブラウザ上で非表示になる際、Reactは自動的にこの返された関数()を呼び出して、タイマーをストップします。 次のチャプターでは、これらを応用して独自のロジックを切り出す「カスタムフック」について学びます!

2

カスタムフックによるロジックの共通化

Reactアプリケーションが成長するにつれ、複数のコンポーネントで「同じ状態管理と副作用の組み合わせ」を使いたいケースが出てきます。 第2章では、React標準のフックを組み合わせて独自のフックを作る カスタムフック(Custom Hooks) の設計方法とメリットについて学びます。 1. カスタムフックとは? カスタムフックは、「状態(State)や副作用(Effect)を伴う再利用可能なロジック」を切り出したJavaScriptの関数 です。 名前は必ず から始めるというルール(例: )があり、関数内部でReact標準のフック( や など)を自由に呼び出すことができます。 * メリット: 1. UIとロジックの分離: コンポーネントが「見た目(JSX)」に集中でき、コードの見通しが良くなります。 2. 再利用性の向上: 同じロジックを複数のコンポーネントで共有できます。 3. 単体テストの容易さ: Reactフックのロジックだけを独立してテストできます。 2. 実用的なカスタムフックの作成例 例1: 画面サイズを追跡する レスポンシブデザインで、JavaScript側で画面幅(モバイルかデスクトップかなど)を判定したい場合に非常に役立ちます。 コンポーネントでの使用例 3. カスタムフック設計のルール カスタムフックを作る際は、以下のルールを守る必要があります。 1. 命名規則: 必ず から始める(これにより、Reactのリンターや実行エンジンが「これはフックである」と正しく認識し、フックのルールを検証できます)。 2. フックの呼び出し制限: ループや条件分岐( 文)、あるいはネストされた関数の中でフックを呼び出してはいけません。常にコンポーネントやカスタムフックの「最上位(トップレベル)」でのみ呼び出します。 3. 状態は共有されない: 同じカスタムフックを2つのコンポーネントで呼び出しても、それらの「状態(State)」は完全に独立 しています(ロジックの書き方は共有されますが、状態自体は共有されません)。状態そのものを共有したい場合は、React Context や状態管理ライブラリを使用します。 カスタムフックを使うことで、複雑なReactコンポーネントをシンプルに保ち、保守性の高いきれいなコードを書くことができます。積極的に活用していきましょう!