できない.dev

依存配列 (dependency array)

別名: 依存配列 / dependency array / deps

useEffect / useMemo / useCallback の第 2 引数に渡す配列。React はこの値を前回と比較し、変化したときだけ Effect の再実行やメモ化のやり直しを行う。

#react#hooks#useeffect#dependency-array#memoization

定義

依存配列(dependency array) は、useEffect / useMemo / useCallback の第 2 引数に渡す値の配列。
React は描画ごとに配列の各要素を前回と Object.is で比較し、ひとつでも変化したときだけ Effect の再実行やメモ化の再計算を行う。

詳細

[] を渡すとマウント時に 1 回だけ、配列自体を省略すると毎描画で実行される。
比較は参照同値なので、オブジェクト・配列・関数リテラルを直接入れると毎回「変化した」と判定され、再実行が連鎖する。
プリミティブ(id・文字列・数値)へ分解する、useMemo / useCallback で参照を固定する、関数型 setState で state を依存から外す、が定石。

よくある誤解

  • 要素は多いほど安全: 逆。
    不要な参照を入れると無限ループの温床になる。
    必要十分な値だけにする。
  • 空にすれば常に安全: 必要な値を外すと古い値を掴む(stale)バグになる。

関連

依存設計のミスは useEffect で無限ループMaximum update depth exceeded として現れる。