useEffect는 리액트 훅의 하나로 리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 해준다. 여기서 렌더링이란 state와 props를 기반으로 UI를 그려내는 행위이다.
형태:
useEffect(함수, 타이밍)
useEffect는 렌더링 이후에 side effect를 실행시킨다. side effect가 렌더링에 영향을 주지 않음을 의미함. 위 형태에서 보았듯이 effect를 일으킬 시점은 두 번째 인자인 의존성 배열에 넘겨주는 값을 통해 실행된다. 즉, 두 번째 인자에 어떤 값이 위치하는 지에 따라 실행되는 시점이 정해진다. 하나씩 살펴보자.
useEffect(() => {
console.log('마운트 됐을 때만')
}, []);
useEffect(() => {
console.log('렌더링이 될 때마다')
});
useEffect(() => {
console.log('value가 업데이트 될 때')
}, [value]);
클린업 이팩트란 이전에 일으켰던 effect를 정리해줄 때 사용한다. 실행시점은 위에서 본 바와 마찬가지이며 useEffect안에 클린업 이팩트를 일으킬 수 있도록 로직을 작성해주면 된다.
useEffect(() => {
setNum(count);
return () => {
setNum(count);
}
}, []);
아래 로직을 콘솔로 찍어 출력해보았을 때 실행 순서는 다음과 같다.
render -> effect
render -> clean -> effect
다음 effect가 일어나기 전에 clean up Effect가 발생하는 것을 알 수있다.
function App() {
const [click, setClick] = useState(false);
console.log('render');
useEffect(() => {
console.log('effect');
return () => {
console.log('clean');
});
}, [click]);
return <div onClick={() => setClick(true)}>click me!</div>;
}