10.1 Hooksのルール
- Hooksはトップレベルで呼ぶ
- HooksはReactコンポーネントまたはカスタムHookから呼ぶ
- 条件分岐・ループ・ネスト関数内で呼ばない
- ESLintルールを有効にする
// 禁止
if (enabled) {
const [value, setValue] = useState("");
}
Reactは呼び出し順序でHookの状態を対応付ける。
10.2 state系
| Hook |
用途 |
useState |
局所state |
useReducer |
複雑な更新規則 |
useActionState |
Actionの結果・pending状態 |
10.3 Context系
| Hook/API |
用途 |
createContext |
Context作成 |
use |
ContextまたはPromiseの読み取り |
useContext |
Contextの読み取り |
useは通常のHookと異なり、条件やループで呼べる。ただしtry/catch内では使えないなど固有の制約がある。
10.4 Ref系
| Hook |
用途 |
useRef |
値・DOM参照 |
useImperativeHandle |
公開ref APIの制御 |
10.5 Effect系
| Hook |
用途 |
useEffect |
外部システムとの同期 |
useLayoutEffect |
描画前の同期 |
useInsertionEffect |
CSS-in-JSライブラリ向け |
useEffectEvent |
Effect内の非リアクティブ処理 |
10.6 パフォーマンス・優先度系
| Hook/API |
用途 |
useMemo |
値の手動メモ化 |
useCallback |
関数の手動メモ化 |
useTransition |
非緊急更新 |
startTransition |
非緊急更新の開始 |
useDeferredValue |
値の遅延 |
useId |
hydration対応の一意ID |
React Compiler利用時、useMemoとuseCallbackの必要性は減るが、意味的に安定した参照が必要な外部APIなどでは残る。
10.7 外部ストア・デバッグ
| Hook |
用途 |
useSyncExternalStore |
外部ストア購読 |
useDebugValue |
カスタムHookのDevTools表示 |
10.8 カスタムHook
function useOnlineStatus() {
return useSyncExternalStore(
callback => {
window.addEventListener("online", callback);
window.addEventListener("offline", callback);
return () => {
window.removeEventListener("online", callback);
window.removeEventListener("offline", callback);
};
},
() => navigator.onLine,
() => true
);
}
カスタムHookはロジックを共有するが、stateそのものを複数利用箇所で共有するわけではない。各呼び出しは独立したstateを持つ。