Reactアプリがある程度複雑になってくると、「似たようなロジックがあちこちに出てくる」。
そういうときに活躍するのがカスタムフック。
使い回せて、読みやすくて、テストもしやすい。まさにReactの設計の要になる機能。
useState
やuseEffect
のようなReactの組み込みフックをベースに、自分専用の機能を切り出して再利用できる関数のこと。
作法としてはただの関数だけど、
use
で始めるという決まりがある。
useAuth
:認証状態を管理するtsx
const { username, login, logout } = useAuth();
useState
管理useTimer
:マウントからの経過秒数を返すtsx
const seconds = useTimer();
setInterval
開始useLocalStorage
:localStorageと状態を同期するtsx
const [value, setValue] = useLocalStorage<T>("key", initialValue);
tsx
// 複数の画面で同じ処理を使いたい
const { username } = useAuth();
tsx
// Before
useEffect(() => {
const timer = setInterval(() => {
setSeconds((s) => s + 1);
}, 1000);
return () => clearInterval(timer);
}, []);
// After
const seconds = useTimer();
→ 本質が一行に凝縮されて、UIロジックと分離できる。
ロジック単体のテストが可能になる。
UIと切り離して機能ごとの責務を分離できるのが最大のポイント。
機能例 | カスタムHookにできる例 |
---|---|
認証状態 | useAuth() |
ダークモード | useDarkMode() |
モーダル制御 | useModal() |
デバウンス処理 | useDebouncedValue(input, delay) |
ページタイトル変更 | useDocumentTitle(title) |
👇 サンプル:ReactカスタムHooks活用デモ