Skip to content

React Hooks 解説

日々使うReactフックを、役割ごとにグループ化してまとめました。stateの保持、effectの実行、メモ化、contextの共有、レンダーの外へのアクセス。各行でフックとその用途を対にして示します。

フックとは、関数コンポーネントがReactの機能(state、ライフサイクル、context、パフォーマンス調整)にアクセスするための関数です。ルールは2つ。フックはトップレベルで呼ぶ(ループや条件の中では決して呼ばない)、そしてReactの関数からのみ呼ぶ。あとは仕事に合ったフックを選ぶだけです。

リファレンステーブル · 24 項目
24 of 24 rows
State
変更されると再レンダーを引き起こす単一の値を保持する。コンポーネントのローカルstate。フォーム項目、トグル、カウンターなど。
アクションのreducerで駆動されるstateを保持する。小さなストアのようなもの。複数の関連するフィールドや複雑な遷移を持つstate。
再レンダーを引き起こさないミュータブルな値を保持する。ミュータブルな入れ物、タイマー、.currentによる直接のDOMアクセス。
Effect
レンダーの後に副作用を実行する。クリーンアップは省略可能。データの取得、サブスクリプション、外部システムとの同期。
effectが返す関数は、次のeffectの前とアンマウント時にもう一度実行される。サブスクリプションやタイマーの解体、進行中のfetchの中断。
useEffectと同じだが、DOM変更の直後に同期的に実行される。ブラウザがペイントする前のレイアウトの読み書き(トースト、ツールチップ)。
イベントハンドラーはユーザーの操作に応じて実行され、effectは同期のためにレンダー後に実行される。ユーザー起因のロジックはハンドラーに、レンダー起因のロジックはeffectに置く。
開発モードではコンポーネントを2回マウントし、effectが実行、クリーンアップ、再実行される。本番前に、二重のサブスクリプションやクリーンアップの欠落を発見する。
パフォーマンス
依存関係が変わるまで、計算された値をキャッシュする。レンダー間の高コストな再計算の回避。意図的にdeps内の値を変えればキャッシュを破棄できる。
依存関係が変わるまで、関数の参照をキャッシュする。メモ化された子に渡す、またはdepsとして使う安定したコールバック。
propsが変わらないコンポーネントの再レンダーをスキップする。重い子コンポーネント。浅い比較で足りない場合は第2引数に比較関数を渡す(HOCであり、フックではない)。
Contextと外部ハンドル
prop drillingなしでcontextの値を読み取る。ツリー全体で共有されるテーマ、ロケール、認証ユーザーなど。
ref越しに親が見るインスタンスをカスタマイズする。forwardRef経由で子から絞り込んだAPIを公開する。
並行処理とその他
state更新を緊急でないものとしてマークし、UIの応答性を保つ。重いリストが再レンダーする間も入力を軽快に保つ。
値を遅延させ、更新を中断可能にする。タイマーなしで高コストなレンダーをデバウンスする。
アクセシビリティ属性用の安定した一意なidを生成する。サーバーとクライアントのレンダーをまたいでlabelとinputを結び付ける。
レンダー中にpromiseやcontextを読み取る。条件付きで呼べる唯一のフック。Suspenseとともにpromiseをアンラップする、または早期returnの中でcontextを読む。
フォームアクションで駆動されるstateを保持する。pendingフラグ付き。エラーや更新されたstateを返し、インラインで表示するフォーム送信。
楽観的な値を即座にレンダーし、アクションが完了すると実際のstateへ戻る。サーバーリクエストの通信中に、いいねや送信済みメッセージを表示する。
囲んでいる<form>のpending状態を、propsなしで読み取る。親フォームの送信中に自分自身を無効化する送信ボタン。
Reactの外のストアに登録し、一貫したスナップショットを1つ読み取る。オンライン状態のようなブラウザAPI、またはサードパーティのstateストア。
layout effectの前に実行される。CSS-in-JSのルール注入のために作られた。レイアウトが読まれる前にルールを挿入する必要があるスタイルライブラリ。
React DevToolsでフックの内部stateにカスタムラベルを表示する。デバッグ中に、カスタムフックが保持するものにラベルを付ける。
組み込みフックを組み合わせてロジックを共有する、自作のフック。useFetchやuseMediaQueryのような再利用可能なステートフルな振る舞い。