useEffect는 컴포넌트가 렌더링된 후 DOM이 업데이트 된 시점에 실행된다. 따라서 DOM요소에 직접 접근하거나 조작하기에 안전하다.
이벤트 리스너:
javascript
Copy
useEffect(() => {
const handleResize = () => {
// 윈도우 크기 변경 처리
};
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
DOM 측정:
javascript
Copy
useEffect(() => {
const element = ref.current;
const rect = element.getBoundingClientRect();
// rect 정보 활용
}, []);
포커스 관리:
javascript
Copy
useEffect(() => {
inputRef.current.focus();
}, []);
외부 라이브러리 통합:
조건부 DOM 업데이트:
javascript
Copy
useEffect(() => {
if (condition) {
// DOM 업데이트 로직
}
}, [condition]);
애니메이션:
스크롤 위치 관리:
클린업:
useEffect를 사용할 때는 항상 의존성 배열을 적절히 관리하고, 필요한 경우 클린업 함수를 제공하여 메모리 누수를 방지하는 것이 중요합니다.
<aside> ❗ useLayoutEffect vs useEffect
</aside>
b. 타이머 정리:
c. 웹소켓 연결 종료:
d. 외부 라이브러리 인스턴스 정리:
e. 비동기 작업 취소:
f. DOM 변경 되돌리기:
```jsx
javascript
Copy
useEffect(() => {
const handleScroll = () => {
// 스크롤 처리 로직
};
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
```
```jsx
javascript
Copy
useEffect(() => {
const timer = setInterval(() => {
// 정기적인 작업 수행
}, 1000);
return () => clearInterval(timer);
}, []);
```
```jsx
javascript
Copy
useEffect(() => {
const socket = new WebSocket('ws://example.com');
// 웹소켓 설정 로직
return () => socket.close();
}, []);
```
```jsx
javascript
Copy
useEffect(() => {
const chart = new Chart(ctx, config);
return () => chart.destroy();
}, []);
```
```jsx
javascript
Copy
useEffect(() => {
let isCancelled = false;
const fetchData = async () => {
const result = await api.getData();
if (!isCancelled) {
// 데이터 처리
}
};
fetchData();
return () => { isCancelled = true; };
}, []);
```
```jsx
javascript
Copy
useEffect(() => {
document.body.style.overflow = 'hidden';
return () => { document.body.style.overflow = ''; };
}, []);
```