Day 6・小さなアプリを作って公開する — 現場の地図
よくある落とし穴とパフォーマンスの基本感覚
key忘れ・stateの直接変更・useEffectの依存漏れ・無限ループの定番ミスと、再レンダリングの基本感覚を身につける。
定番の落とし穴を「先に知っておく」
初心者がハマる落とし穴は、実はほとんどが同じ数パターンです。先に知っておけば、多くは踏まずに済み、踏んでも「あ、あれか」とすぐ直せます。最終レッスンでは、4つの定番ミスと、パフォーマンスの基本感覚を地図として渡します。暗記ではなく「症状 → 原因 → 直し方」を結びつけて覚えるのがコツです。
落とし穴1: リストの key 忘れ
map でリストを描くとき、各要素に key(重複しない目印)をつけ忘れると警告が出ます。key はReactが「どの要素がどれか」を見分けるための名札です。名札がないと、要素を並べ替えたり消したりしたときに、Reactが取り違えて表示がおかしくなります。key には配列の順番(index)ではなく、データが持つ一意なID(id など)を使いましょう。
危うい
key がない、または並べ替えで壊れる index を key にしている
{tasks.map((task, i) => (
<li key={i}>{task.text}</li>
))}
// 並べ替え・削除で取り違えが起きやすい正しい
データの一意なIDを key にする
{tasks.map((task) => (
<li key={task.id}>{task.text}</li>
))}落とし穴2: state の直接変更
state を tasks.push(...) のように直接いじると、Reactは中身が変わったことに気づかず、画面が更新されません。stateは「新しい値に置き換える」のが原則です。配列なら [...古い, 新しい]、オブジェクトなら { ...古い, 変える所 } と、コピーを作って更新関数に渡します。
反映されない
元の配列を直接いじっているのでReactが気づかない
tasks.push({ id: 1, text: "買い物" });
setTasks(tasks); // 同じ配列。変化とみなされない正しい
新しい配列を作って渡す
setTasks([...tasks, { id: 1, text: "買い物" }]);落とし穴3と4: useEffectの依存漏れと無限ループ
useEffectの第2引数([]で囲む依存配列)は「この値が変わったら実行し直す」というリストです。使っている値を書き忘れる(依存漏れ)と、古い値のまま動き続けます。逆に、effectの中でstateを毎回更新しているのに依存配列を空にしなかったり、更新→再実行→更新…が連鎖したりすると、無限ループになって画面が固まります。
無限ループ
実行のたびにcountを増やし、それが再実行を呼び、また増える…
useEffect(() => {
setCount(count + 1); // 更新→再実行→更新…
}, [count]);正しい
最初の1回だけ実行するなら依存配列を空にし、更新は関数形式で
useEffect(() => {
// 最初の1回だけ動かしたい処理
setCount((prev) => prev + 1);
}, []); // 依存が空なので初回のみパフォーマンスの基本感覚: 増やさない、まず計測
Reactはstateが変わると、その部品を描き直します(再レンダリング)。ふつうはこれで十分速く、心配は要りません。パフォーマンスの基本感覚は2つだけ。ひとつは「不要な再レンダリングをむやみに増やさない」(たとえば巨大なリストの全部を毎回作り直さない)。もうひとつは「遅いと感じたら、勘で最適化せず、まず計測する」ことです。
よくある落とし穴: 早すぎる最適化
「速くしなきゃ」と最初から複雑な最適化(useMemoやuseCallbackの乱用)を入れると、コードが読みにくくなり、バグの温床になります。ほとんどのアプリは素直に書けば十分速い。遅いと感じてから、計測して、遅い場所だけ直す。この順番を守りましょう。
AIにはこう聞く
「このReactの警告(key忘れ・依存漏れなど)の意味と直し方を教えて」とメッセージごと貼れば、原因と修正を返してくれます。パフォーマンスなら「まずどこが遅いか計測する方法を教えて」と聞くのが賢い。症状と原因の対応を自分が知っていれば、AIの提案が的外れかどうかも判断できます。
おわりに — きみはReactの土台を説明できる
ここまで本当によく走りきりました。振り返れば、JSXという見た目の書き方から始まり、部品(コンポーネント)、外からの入力(props)、覚えておく値(state)、外の世界とのやりとり(effect)、リストとフォーム、そして複数画面と公開までたどり着きました。もう「なんとなく動く」ではありません。
きみは今、Reactの土台を自分の言葉で説明できます。「画面は部品の組み合わせ」「状態は共通の親に置いて props で配る」「更新は新しい値に置き換える」「Next.jsがルーティングと公開の土台を足す」——これらを読めて、直せて、説明できる。ここが本当のスタート地点です。あとは小さなアプリを1つ作って公開してみるだけ。AIを相棒に、自信を持って前に進んでください。おつかれさまでした。
読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
リストを map で描くとき key に使うべき値として最も適切なのはどれ?
useEffect の依存配列に [count] を入れ、その中で setCount(count + 1) を呼ぶとどうなる?
state を直接変更してはいけない理由と、正しい更新のしかたを説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。