useEffect
Componentを外部システムと同期させるためのhooks ref
「useEffect」という名前が悪いmrsekut.icon
ReactにおけるEffectとは、(eventによってではなく)renderによって引き起こされる副作用のこと ref
docs
useEffect周りのdocs
エフェクトを使って同期を行う – React
そのエフェクトは不要かも – React
リアクティブなエフェクトのライフサイクル – React
エフェクトからイベントを分離する – React
https://ja.react.dev/learn/removing-effect-dependencies
docsに倣って以下の様に呼ぶ
code:ts
useEffect(() => {
// setup code
return () => {
// cleanup code
};
}, ...);
useEffectのライフサイクル
「同期の開始」と「同期の終了」の2つしかない
同期の開始時に、setup codeを実行する
同期の終了時に、cleanup codeを実行する
Componentのライフサイクル視点で見る
setup codeは毎回のrendering後に実行される
ただし、第2引数(deps)の指定の仕方によって実行をスキップできる
useEffectのdepsを指定した場合
rendering後にその値が前回から変化していたら実行される
renderingがトリガーなのであって、useEffect自体にはトリガーの機能はない
「[..]の値が変更されたら実行」ではないことに注意
配列の中に複数設定した場合、どれかが以前から変更されていれば実行される
空配列を指定した場合 ref
mount時とunmount時のみ発火する
cleanupに書いたものはunmount時
useEffectのdepsを何も指定しなかった場合 ([]もなし)
renderingされるたびに実行される
初回とか、stateが変更されたときとか
何も指定していないときと、[]を指定したときは挙動が異なる
意味ないのでこんな書き方はしない
Compoenntのライフサイクルと独立に考えたほうが理解しやすい
コンポーネントの視点から見ると、エフェクトは、“レンダー直後” や “アンマウント直前” のように
特定のタイミングで発生する “コールバック関数” や “ライフサイクル中のイベント” であると考えたくなります。
しかし、このような考え方はすぐにややこしくなるため、避けた方が無難です。
その代わりに、エフェクトの開始/終了という 1 サイクルのみにフォーカスしてください。
コンポーネントがマウント中なのか、更新中なのか、はたまたアンマウント中なのかは問題ではありません。
どのように同期を開始し、どのように同期を終了するのか、これを記述すれば良いのです。 ref
useEffectのcleanup
useEffectの中で非同期関数を呼ぶ
propsが変化したときにstateをリセットする
dev環境でuseEffectの内部が2回実行される
#WIP
useEffectはclientでのみ実行される
docs
SSR時には実行されない
clientで、loadとhydrationが完了した後に実行される
https://ja.react.dev/reference/react/useEffect#displaying-different-content-on-the-server-and-the-client
初回は実行したくなければ以下のuseDidUpdateEffectを使うと良い ref
code:ts
export function useDidUpdateEffect(
fn: EffectCallback,
inputs?: DependencyList
) {
const didMountRef = useRef(false);
useEffect(() => {
if (didMountRef.current) fn();
else didMountRef.current = true;
}, inputs);
}
useInsertionEffect
https://ja.reactjs.org/docs/hooks-reference.html#useinsertioneffect
dom更新の前に呼び出される
依存リストをカスタマイズしたい
https://blog.uhy.ooo/entry/2020-05-24/react-custom-deps/
https://zenn.dev/fujiyama/articles/c26acc641c4e30#データフェッチング
fetch時にuseEffectを使う
参考
https://overreacted.io/ja/a-complete-guide-to-useeffect/
Dan氏の。長い。
useEffectフックのしくみ - Qiita
https://numb86-tech.hatenablog.com/entry/2019/10/23/121332
https://zenn.dev/uhyo/articles/react17-useeffect
React v17でclean up関数の実効タイミングが変わった
https://alexsidorenko.com/blog/useeffect/
visual guide
https://alexsidorenko.com/blog/useeffect-cleanups/
https://beta-reactjs-org-git-you-might-not-fbopensource.vercel.app/learn/you-might-not-need-an-effect#resetting-all-state-when-a-prop-changes