第138章:【フック】useDebugValue
この章では、**カスタムフック専用の「デバッグ用フック」**である
useDebugValue を使えるようになるのがゴールです ✨
1️⃣ useDebugValueってなに?ざっくりイメージ
useDebugValue は、React が用意してくれている公式フックで、
- ✅ カスタムフックの中だけで使える
- ✅ React DevTools 上の表示をわかりやすくするラベルを付けられる
- ✅ 画面の見た目は一切変わらない(開発者用のメガネだけ)
- ✅ 本番(production)のパフォーマンスにはほぼ影響しない設計💡(React)
という、開発者向けのお助けフックです。 React公式ドキュメントでは「主にライブラリ作者向けのフック」のグループに入っています。(React)
2️⃣ どこで何が見えるの?👀
useDebugValue の効果は React DevTools で確認します。
React DevTools でコンポーネントを選ぶと、Hooks の一覧が出てきますよね? 通常はこんな感じの表示です:
StateEffectCustomHookName- などなど…
ここに カスタムフック用のラベル+値 を表示してくれるのが useDebugValue です。(React)
例えば useOnlineStatus というフックの中で
"Online"/"Offline"みたいなラベルを出したり、width x heightの文字列を出したり、
といった「人間に優しい表示」にできます ✨
3️⃣ ルール:どこで使えるの?⚠️
useDebugValue には、ちょっと大事なルールがあります:
-
カスタムフックの中でだけ使う
function useSomething(...) { ... }の中- ふつうのコンポーネントの中に書いても DevTools には出ません(LogRocket Blog)
-
フックのトップレベルで呼ぶ
useStateやuseEffectと同じで、 if 文やループの中に書かない(Hooks のルール)
-
返り値はない
useDebugValue自体は 何も返さない- 画面にも何も表示されない(DevTools専用)(React)
4️⃣ いちばんシンプルな例:useToggle にラベルを付ける🎚️
まずは、ON/OFF を切り替えるだけのカスタムフックを思い出しつつ、
そこに useDebugValue を足してみます。
🔧 カスタムフック側
import { useState, useDebugValue } from "react";
type UseToggleReturn = [boolean, () => void];
export function useToggle(initialValue = false): UseToggleReturn {
const [value, setValue] = useState<boolean>(initialValue);
// 🔍 DevTools 用のラベルを付ける
useDebugValue(value ? "Toggle: ON 🔆" : "Toggle: OFF 🌙");
const toggle = () => {
setValue((prev) => !prev);
};
return [value, toggle];
}
🧩 使う側のコンポーネント
import { useToggle } from "./useToggle";
export function ToggleDemo() {
const [isOn, toggle] = useToggle();
return (
<button onClick={toggle}>
{isOn ? "ON 🔆" : "OFF 🌙"}
</button>
);
}
画面上はただのボタンですが、React DevTools で ToggleDemo を選ぶと
Hooks の一覧に、だいたいこんな感じの表示が入ります:
useToggle: "Toggle: ON 🔆"oruseToggle: "Toggle: OFF 🌙"
※正確な文言やフォーマットは DevTools のバージョンによって少し違う場合がありますが、 「カスタムフック名」と「useDebugValue で渡した値」 がセットで見えるイメージです。(React)
5️⃣ React DevTools で確認してみよう手順(Windows想定)🖥️
npm run devでアプリを起動する- ブラウザで
http://localhost:5173(Vite のデフォルト)を開く - F12 / Ctrl+Shift+I で開発者ツールを開く
- 上部のタブから
Reactを選ぶ(React DevTools 拡張) - 左側で
ToggleDemoコンポーネントを選択 - 右側の Hooks のところを見る →
useToggleの行に、さっきの"Toggle: ON 🔆"などが表示される 🎉
ポイント:
console.logを増やさなくても、 「今このカスタムフック、内部的にはどういう状態?」が ざっくり一目で分かるようになります 💡
6️⃣ 第2引数 format で「重い処理」をあと回しにする🧠
useDebugValue は、実は 第2引数 を取ることができます:(React)
useDebugValue(value, formatFunction);
value: DevTools に渡したい元データ(なんでもOK)formatFunction:valueを受け取って、表示用の形に変換する関数
React DevTools でそのカスタムフックを実際にクリックして展開したときだけ
この formatFunction が呼ばれるので、
「重い計算」はここに閉じ込めておくのがコツです。(React)
📏 例:useWindowSize に見やすいラベルを付ける
import { useEffect, useState, useDebugValue } from "react";
type WindowSize = {
width: number;
height: number;
};
export function useWindowSize(): WindowSize {
const [size, setSize] = useState<WindowSize>({
width: window.innerWidth,
height: window.innerHeight,
});
useEffect(() => {
const handleResize = () => {
setSize({
width: window.innerWidth,
height: window.innerHeight,
});
};
window.addEventListener("resize", handleResize);
// クリーンアップ
return () => {
window.removeEventListener("resize", handleResize);
};
}, []);
// 🧾 DevTools のためのフォーマット関数
useDebugValue(size, (value) => {
return `WindowSize: ${value.width} x ${value.height}`;
});
return size;
}
- 通常のレンダリング中は、ただ
sizeのオブジェクトを持っておくだけ - DevTools でこのフックを展開したときにだけ
WindowSize: 1920 x 1080みたいな文字列を計算して表示してくれます ✨
7️⃣ 図で見る:useDebugValue の位置づけ(Mermaid)🧭
カスタムフック・コンポーネント・DevTools の関係を簡単に図にしてみます 🌈
- コンポーネント → カスタムフックを呼ぶ
- カスタムフック →
useDebugValueを介して DevTools に「分かりやすいラベル」を提供 - ふつうのユーザーはまったく知らない世界、開発者だけの補助線です 💫
8️⃣ もう少し実践:useLocalStorage にデバッグ表示を足す📦
前の章で作ったような useLocalStorage を想定して、
「今このキーにはどんな値が入ってるの?」 を DevTools に出してみます。
🧠 サンプル実装(簡略版)
import { useState, useEffect, useDebugValue } from "react";
type UseLocalStorageOptions<T> = {
key: string;
initialValue: T;
};
type UseLocalStorageReturn<T> = [T, (value: T) => void];
export function useLocalStorage<T>({
key,
initialValue,
}: UseLocalStorageOptions<T>): UseLocalStorageReturn<T> {
const [value, setValue] = useState<T>(() => {
if (typeof window === "undefined") {
return initialValue;
}
try {
const stored = window.localStorage.getItem(key);
if (stored == null) return initialValue;
return JSON.parse(stored) as T;
} catch {
return initialValue;
}
});
useEffect(() => {
try {
window.localStorage.setItem(key, JSON.stringify(value));
} catch {
// 本番ならエラーログ出したりしてもOK
}
}, [key, value]);
// 🧊 DevTools 用のラベル(フォーマット関数付き)
useDebugValue(value, (v) => {
const preview =
typeof v === "string" ? v : JSON.stringify(v).slice(0, 30);
return `localStorage[${key}] = ${preview}`;
});
const update = (next: T) => {
setValue(next);
};
return [value, update];
}
React DevTools で、このフックを使っているコンポーネントを選ぶと、 たとえばこんな感じの情報が見えます:
useLocalStorage: "localStorage[userName] = Alice"useLocalStorage: "localStorage[todoList] = [{\"id\":1,...]"(途中まで)
「今 localStorage に何が入ってるのか」を、 コンソールを開かずにサッと確認できるのがうれしいポイントです 💖
9️⃣ いつ使う?いつ使わない?バランス感覚📊
✅ 使うと便利な場面
-
ロジックが ちょっと複雑なカスタムフック
useLocalStorage,useFetch,useFormStateなど
-
いろいろな画面から再利用される「共通フック」
-
チーム開発で、
- 「このフック、内部的に何してるの?」と聞かれがちなもの
こういうフックに useDebugValue が入っていると、
React DevTools を開くだけで説明書きが見えるようなイメージです。(Medium)
🚫 あまりオススメしない場面
-
めちゃシンプルなフック(状態ひとつだけ等)で、
- DevTools を見ても混乱しないもの
-
プロジェクト内だけでちょっと使う程度の一時的なフック
-
全てのカスタムフックに惰性的に入れる(情報過多になって逆に見づらい)
公式ドキュメントでも、 「すべてのカスタムフックに付ける必要はなく、共有ライブラリ的なフックで特に有用」 と言われています。(React)
🔚 この章のまとめ 🎉
-
useDebugValueは カスタムフック用のデバッグ専用フック -
画面ではなく React DevTools の Hooks 表示をわかりやすくする
-
第2引数にフォーマット関数を渡すと、
- DevTools で展開されたときだけ実行されるので、
- 重い計算をそこに閉じ込めておける
-
useToggle/useWindowSize/useLocalStorageなどに付けると 「今の状態」が一瞬で把握できて超便利 ✨
🎓 ミニ練習問題
時間があるときに、VSCode で実際に試してみてください 💪
-
練習①:
useToggleを改造-
useToggleのuseDebugValueを"ON"/"OFF"だけでなく、初期値が true だったかどうかも一緒にラベルに入れてみる 例:"Toggle(初期値: true) → 現在: OFF"みたいな感じ
-
-
練習②:
useLocalStorageのキー名だけを一覧にしたいuseLocalStorageフックを2つ以上使っている画面を作る- それぞれのフックで、
useDebugValueのフォーマットを工夫して 「どのキーがよく使われているか」 を DevTools からパッと分かるようにしてみる
次の章では、useDebugValue とは別系統の「データ更新をラクにしてくれるフック」たちも見ていきます 🚀
まずは、自分のカスタムフックに 1か所だけ useDebugValue を試しに入れてみるところから始めてみてくださいね〜!😊💻✨