외부 시스템과 컴포넌트를 동기화시켜주는 React Hook
React 컴포넌트에서 side effect를 수행하기 위해 사용되는 훅
ex. 데이터 패치, 구독 설정, DOM 수동 조작 등
순수 함수의 범위를 벗어나는 모든 연산
→ component가 순수함수가 되기 위해 따로 관리
mount, unmount, update 시 특정 작업 실행 가능
mount
: 컴포넌트가 최초로 렌더링될 때unmount
: 컴포넌트가 화면에서 사라질 때update
: 컴포넌트가 업데이트될 때useEffect(() => effect 함수, deps 배열);
useEffect(() => { ... }, []);
useEffect(() => { ... });
useEffect(() => { ... }, [ ... ]);
component unmount
clean-up 함수 실행
component mount
effect 실행
useEffect(() => {
// mount, update 시점에 실행
return () => {
// unmount, update직전 시점에 실행
};
}, [deps]);
setInterval
, setTimeout
, effect에서 생성한 이벤트 리스너의 구독 취소가 필요한 경우useEffect(() => {
setInterval(() => setCount(prev => prev + 1), 1000);
}, []);
useEffect(() => {
const timer = setInterval(() => setCount(prev => prev + 1), 1000);
return () => clearInterval(timer); // 클린업 함수
}, []);
단일 목적의 useEffect
가능하다면 커스텀 훅 사용
useEffect 내에서 사용하는 모든 변수들을 의존성 배열에 추가
나중에 읽어봐야지 (영어 실력이 좋아진다면 ~
Render
DOM Tree 구성하기 위해 각 element의 스타일 속성 계산Paint
실제 스크린에 layout 표시하고 업데이트useLayoutEffect(() => {
// input 요소에 포커스 맞추기
inputRef.current.focus();
}, []);
useEffect
vs. useLayoutEffect
useEffect | useLayoutEffect | |
---|---|---|
실행 시점 | Paint 이후 effect 실행 | Paint 직전 effect 실행 |
동기/비동기 | 비동기적 실행 | 동기적 실행 |
사용 의도 | 대부분의 side effect 처리 | DOM의 읽기나 수정이 필요한 경우 사용, 애니메이션 효과나 포커스 관리에 적합 |
장점 | DOM 조작이 필요없는 작업 처리할 때, 성능 저하없이 사용 | 화면에 그려지기 전에 완료 → 화면 깜짝임 방지 |
단점 | 화면 그려진 후 작업 → 화면 깜빡임 | 렌더링 프로세스 지연 → 성능 저하 |