리액트 공식 문서를 참고한 정리 내용 (25.08 기준)
브라우저가 화면을 다시 그리기 전에 실행되는
useEffect이다.
useLayoutEffect(setup, dependencies?)
useLayoutEffect를 호출하여 브라우저가 화면을 다시 그리기 전에 레이아웃을 계산한다.
import { useState, useRef, useLayoutEffect } from 'react';
function Tooltip() {
const ref = useRef(null);
const [tooltipHeight, setTooltipHeight] = useState(0);
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipHeight(height);
}, []);
// ...
setup(필수)dependencies(선택)setup 안에서 쓰이는 모든 반응형 값들을 배열에 넣음useLayoutEffect는 undefined를 반환한다.
1. 호출 위치 제한
2. Strict Mode
3. 의존성 문제
4. 실행 환경
5. 성능 주의
useLayoutEffect 안의 코드는 브라우저가 화면을 그리기 전에 실행도며, useEffect를 사용하는게 더 좋다!6. State 업데이트 주의
useLayoutEffect 안에서 state를 바꾸면 React가 즉시 다른 Effect(useEffect 등)까지 전부 실행시킨다.👉
useLayoutEffect는 화면 그리기 전에 실행되므로 꼭 필요한 경우에만 쓰고, cleanup을 잘 구현하며, 의존성과 성능 문제를 주의해야 한다.
--
대부분의 컴포넌트는 렌더링을 위해 해당 컴포넌트의 화면상 위치와 크기를 알 필요가 없다.
React에서 컴포넌트가 JSX를 반환하면 브라우저는 해당 컴포넌트의 위치와 크기(레이아웃)를 계산한 뒤 화면을 다시 그린다.
예를 들어, 버튼에 마우스를 올렸을 때 툴팁을 띄우고 싶다고 가정해보자.
이때 브라우저는 화면에 충분한 공간이 있는지 확인하고, 만약 공간이 부족하다면 툴팁을 위·아래·좌우 중 적절한 위치에 표시해야 한다.
단, 이 과정이 브라우저가 화면을 그린 후에 일어나면, 사용자가 “툴팁이 위 → 아래로 순간 이동하는 것”을 보게 된다. (깜빡임..)
이를 해결하기 위해서는
useLayoutEffect를 사용하여 브라우저가 화면을 다시 그리기 전에 실행되도록 한다.
1차 렌더 → 크기 측정 → 위치 재계산 → 재렌더를 화면이 그려지기 전에 끝내, 결과적으로 사용자는 툴팁이 처음부터 올바른 위치에 있는 것처럼 보게 된다.
👉 툴팁처럼 화면 배치(레이아웃)를 계산해야 하는 UI는, 깜빡임 없이 올바른 위치에 표시하려고 useLayoutEffect에서 미리 레이아웃 계산을 한다.