useEffect
는 기본적으로 컴포넌트의 첫 번째 렌더링 이후에 실행되며, 그 이후의 모든 업데이트에서 수행된다. 따라서 useEffect
가 수행되는 시점에는 이미 DOM이 업데이트 되고 난 상태인 것이다.
deps
가 빈 배열이면 컴포넌트가 mount된 시점에 딱 한번만 실행됨deps
를 전달하지 않으면 컴포넌트가 리렌더될 때마다 실행됨React는 우리가 useEffect
에 넘긴 함수(effect)를 기억하였다가 DOM을 업데이트한 이후에 실행한다.
useEffect
에 전달된 함수가 모든 렌더링에서 다르다. 리렌더링할 때마다 모두 이전과 다른 effect로 교체된다. 각각의 effect는 특정한 렌더링에 속한다.
컴포넌트의 렌더링 안에 있는 모든 함수는 렌더가 호출될 때 정의된 props와 state 값을 잡아둔다. useEffect
는 리액트 트리 바깥에 있는 것들을 props와 state에 따라 동기화 할 수 있게 한다.
컴포넌트 unmount ➡ cleanup 함수 실행 ➡ 컴포넌트 mount ➡ effect 실행
useEffect(() => {
ChatAPI.subscribeToFriendStatus(props.id, handleStatusChange);
// cleanup 함수
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.id, handleStatusChange);
};
});
DOM이 업데이트 된 후에 네트워크 요청을 보내거나, DOM을 변형하거나 로깅을 하는 등의 side effect는 cleanup이 필요하지 않다.
setInterval, setTimeout을 사용해 등록한 작업이나 effect에서 생성한 이벤트 리스너가 중복 생성되지 않도록 제거하거나, 구독을 취소하는 경우 필요하다.
리렌더링 되었을 때 React가 effect를 실행하기 전에 이전의 렌더링에서 파생된 effect를 정리해주어야 한다.