やあ、こんにちは。Reactの世界へようこそ。
フロントエンドの荒波に揉まれていると、必ず一度は「あ、これ何で動かないの?」「また`useEffect`で無限ループしちゃったよ…」と頭を抱える夜があるはずだ。大丈夫、君だけじゃない。世界中のエンジニアが同じ壁にぶつかってきたんだ。
今日は、その中でも特に初心者が沼にハマりやすい「依存配列(Dependency Array)」のルールについて、コーヒーでも飲みながらゆっくり話そうか。
—
依存配列って、一体なにもの?
Reactの`useEffect`は、「何かが起きたら、これをしてね」という命令を出すための道具だ。
想像してみてほしい。君がキッチンで料理をしているとしよう。
「お湯が沸騰したら(きっかけ)、パスタを茹でる(アクション)」というルールを作ったとする。この「お湯が沸騰したら」という条件を指定するのが、`useEffect`の最後にある`[]`、つまり依存配列なんだ。
もしこの配列を空っぽにしたり、適当に省略したりすると、Reactは「いつ動けばいいのか分からない!」とパニックになるか、逆に「とにかく全部のタイミングで動け!」と暴走し始める。
eslint-plugin-react-hooks の「exhaustive-deps」ルール
開発中にエディタで「おい、依存配列に入れ忘れてるぞ!」と警告が出ることはないかな? あれは`eslint-plugin-react-hooks`という、僕らを守ってくれる頼もしい用心棒だ。
このルールは「中で使っている値は、全部依存配列の中に書き込みなさい」と言っている。これを無視して無理やり`[]`を空にするのは、「お湯が沸騰したかどうかを確認せずに、ずっとパスタを茹で続ける」ようなものなんだ。結果は…目に見えているよね。
—
なぜ「省略」してはいけないのか?
初学者の頃は「面倒だから空にしておこう」とか「警告がうるさいから無視しよう」と思うかもしれない。でも、それは「情報の食い違い」を生む一番の原因になるんだ。
例えば、ユーザーのIDが変わったのに、プロフィール画面が更新されないバグ。これは大抵、依存配列に`userId`を入れ忘れていることが原因だ。Reactは「君が配列に書いたものだけを見て判断する」という約束事があるから、そこに書かない限り、外の世界の変化を無視し続けてしまうんだよ。
—
実践:正しく書いて、トラブルを防ごう
具体例を見てみよう。ユーザーIDを受け取って、その人の名前を表示するコンポーネントだ。
import React, { useState, useEffect } from ‘react’;
function UserProfile({ userId }) {
const [userName, setUserName] = useState(”);
useEffect(() => {
// ユーザーIDが変わるたびに、名前をフェッチ(取得)する
console.log(“ユーザー情報を取得します”);
// ここで userId を使っているから、依存配列に必ず入れる必要がある!
// もしここを [] にすると、初回しか取得されず、IDが変わっても名前が古いままになる
}, [userId]);
return
;
}
このコードなら、`userId`が「1」から「2」に変わった瞬間、Reactは「あ、配列の中身が変わった!じゃあまた`useEffect`を実行しなきゃ」と正しく気づいてくれる。これが「同期」というReactの魔法の正体だ。
—
どうしても「空」にしたい時もある?
もちろん、例外はある。例えば「コンポーネントが画面に表示された最初の一回だけ動かしたい」というケースだ。
そんな時は、依存配列を空`[]`にしてもいい。ただし、これは「この中では外の変数を一切使っていません」という意思表示だ。もしその中で状態(State)やPropsを使っているなら、それは設計を見直すサインかもしれないね。
「どうしても警告が消えない!」という時の処方箋
もし関数を依存配列に入れて、無限ループが止まらなくなったら…その時は`useCallback`という道具の出番だ。関数を「固定」してあげることで、無駄な再実行を防げるんだよ。
—
最後に:完璧じゃなくていい
最初は警告が出るたびにドキッとするかもしれない。でも、それはReactが君に「今のコード、ちょっと危ないよ、一緒に直そう?」と優しく手を差し伸べてくれている証拠なんだ。
「 exhaustive-deps(依存配列の網羅)」は、ただのルールじゃない。君が書いたコードを、未来の君自身が「あれ、これどういう仕組みだっけ?」と読み返したときに、ちゃんと意図通りに動くように支えてくれる「安心の保険」なんだよ。
焦らなくて大丈夫。まずは警告を素直に受け入れて、依存配列に値を入れてみる。それだけで、君の書くコードはグッとプロの領域に近づくはずだ。
また困ったことがあったら、いつでも聞いてくれ。一緒に最高のアドベンチャーを続けよう!

コメント