ReactのuseEffect()の第二引数
多分React初心者なら誰もが気になるuseEffect()の第二引数についてです。私が気になった部分について書きます。
useEffect()についておさらい
- 副作用に関する挙動を書くReact Hooksである。
- レンダリングされたDOMが画面に反映された後に動作する。(同期的なレンダリングを行いたい場合、useLayoutEffect()という関数を利用できる)
- デフォルトだとレンダリング終了後に毎回呼び出されるが、第二引数でタイミングを変更可能である。
- 空の配列 ([]) を渡した場合、useEffect()では props と state の値は常にその初期値のままとなる。
useEffect()の第二引数にsetState()を渡したら?
useEffect()内にてstateを利用することは良くある。例えば、他のuseEffect()でstateを更新していて、そのstateが更新されたときに処理を行いたい場合等。その場合、useEffect()の第二引数には更新対象のstateを含むだろう。では、そのstateを更新するsetState()も第二引数に含んだらどうなるのだろうか?
結論:特に変わらない。stateを監視したいのであればそのstateのみを第二引数に含めれば良く、setState()を含める必要はない。
Reactのドキュメントに以下のような記述がある。
React は再レンダー間で setState 関数の同一性が保たれ、変化しないことを保証します。従って useEffect や useCallback の依存リストにはこの関数を含めないでも構いません。
References
- React:フック API リファレンス,React公式ドキュメント,React Organization (オンライン)、入手先 https://ja.reactjs.org/docs/hooks-reference.html (参照2020-09-19).