React useLayoutEffect — ペイント前のDOM測定

DOM測定にuseEffectの代わりにuseLayoutEffectを使うタイミングを学びます。ツールチップの配置、スクロール復元、アニメーショントリガー、視覚的なフリッカー防止を網羅。

Effect Hooks

詳細な説明

useLayoutEffectによるDOM測定

useLayoutEffectはDOM変更後、ブラウザがペイントする前に同期的に実行されます。ユーザーが更新を見る前にDOMを測定または変更する必要がある場合に適切な選択です。

useEffect vs useLayoutEffect のタイムライン

レンダリング -> DOM変更 -> useLayoutEffect -> ブラウザペイント -> useEffect

useEffectだとフリッカーが発生する理由

useEffectでは、ツールチップはまず(0, 0)でレンダリングされ、ブラウザがそこでペイントし、その後でのみ位置が修正されます -- 可視的なフリッカーが発生します。useLayoutEffectはペイント前に位置を更新することでこれを防ぎます。

パフォーマンスの警告

useLayoutEffectはブラウザのペイントをブロックします。エフェクトが遅い場合、ユーザーはフリーズした画面を見ることになります。視覚的なフリッカーを本当に防ぐ必要がある場合にのみ使用してください。

ユースケース

ツールチップとポップオーバーの配置、レイアウト調整時のフリッカー防止、スクロール位置の復元、アニメーションのための要素の測定、ユーザーがフレームを見る前に完了する必要のあるDOM操作にuseLayoutEffectを使用します。

試してみる — React Hooks Reference

フルツールを開く