티스토리 뷰
4. useEffect
: side-Effect를 처리하기 위한 Hook
: 컴포넌트가 로드될 때, 외부에서 발생하는 작업을 처리하는 함수
const Component=()=>{
...
useEffect(()=>{
// 할 일
}, [props, state] //<- 의존성 배열로 안의 요소 값이 변하면 useEffect 실행
}
const App = () => {
const [count, setCount] = useState(0);
// useEffect로 부수효과 처리
useEffect(() => {
// 이 함수는 렌더링 후에 실행
console.log('컴포넌트가 렌더링되었습니다!');
}, []); // 빈 배열을 전달하면 이 effect는 컴포넌트가 처음 렌더링될 때만 실행
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>증가</button>
</div>
);
};
4.1 의존성 배열
1) 설정 X
:: 의존성 비교 없이 렌더링할 때마다 실행
:: 컴포넌트의 렌더링 여부 확인을 위해 사용
const Component1 = () => {
console.log("렌더링");
}
const Component2 = () => {
useEffect(()=>{
console.log("렌더링");
}) // 아무것도 설정 X시, 렌더링마다 실행
}
- Q: 함수형 컴포넌트는 렌더링되는데, 그럼 useEffect는 필요없는 게 아닐까?
- A: 2가지의 차이점을 가진다.
1) SSR관전에서 useEffect는 클라이언트에서 실행되는 것을 보장해줌을 의미(WB의 API이용 가능-window ..)
2) useEffect는 컴포넌트의 렌더링 완료 후에 실행
-> Compoenet1은 렌더링 중에 실행(SSR의 경우 서버에서 실행됨을 의미)
=> 부수 효과를 주는 의미에서는 useEffect를 명시하자.
2) [ ] : 빈 배열 설정
:: 맨 처음 렌더링에서만 실행 -> 이후에는 실행 X
const Component2 = () => {
useEffect(()=>{
console.log("첫 렌더링입니다.");
},[]) // 빈배열 설정, 첫 렌더링만 실행
}
3) props
:: 해당 props의 변화가 있다면, 해당을 실행
const Component2 = () => {
useEffect(()=>{
console.log("값이 바뀐 렌더링입니다.");
},[props])
}
4.2 Cleanup 함수
: 컴포넌트가 언마운트될 때 or 의존성 배열의 값이 변경될 경우, 실행
: 이전에 해당 함수에서 설정된 side-effect를 정리하여 메모리 누수 방지 및 불필요한 리소스 해제
Ex)
const TimerComponent = () => {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
// 타이머 설정
const timerId = setInterval(() => {
setSeconds(prev => prev + 1);
}, 1000);
// 컴포넌트가 언마운트될 때 타이머 정리 (클린업)
return () => {
clearInterval(timerId);
console.log('타이머가 정리되었습니다.');
};
}, []); // 빈 배열을 전달하여 컴포넌트가 처음 렌더링될 때만 실행
return (
<div>
<h1>{seconds} 초</h1>
</div>
);
};
- 특정 이벤트 및 조작 등이 렌더링마다 무수히 추가되는 것을 방지
4.3 주의점
1) eslint-disable-line react-hooks/exhaustive-deps 자제
2) 되도록 기명함수로 작성-용도 파악이 용이하도록
3) 외부함수의 추가는 자제
4) 부수효과를 거대하게 작성 X
5) useEffect안에 직접적으로 async 사용 시, useEffect의 경쟁 상태를 초래
- 5-1) 경쟁 상태 해결을 위해서는 클린업 함수를 사용
:: 비동기 함수를 직접 호출 X,
:: 클린업 함수를 사용하여 컴포넌트 언마운트 시, 비동기 작업을 취소
or 새요청이 완료되기 전의 이전 요청을 취소하도록 처리해야함
참고
asac 수업 자료
모던 리액트 Deep Dive
'정리용 > react' 카테고리의 다른 글
[07-React] 6-6. React Hook :: useLayoutEffect (0) | 2025.01.17 |
---|---|
[07-React] 6-7. React Hook :: useMemo, React.memo (0) | 2025.01.17 |
[07-React] 6-5. React Hook :: useContext (0) | 2025.01.15 |
[07-React] 6-3. React Hook :: useRef (0) | 2025.01.15 |
[07-React] 6-2. React Hook :: useReducer (0) | 2025.01.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- acac
- useRef
- acas#acas7기
- useLayoutEffect
- react
- memo
- asac7기
- useCallback
- useReducer
- asac7#asac
- useEffect
- useMemo
- asac#asac7기
- ASAC
- asac7
- ssh
- Nginx
- git
- useContext
- useState
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함