컴포넌트가 렌더링될 때마다 특정 작업을 수행하도록 설정할 수 있는 함수형 컴포넌트의 hook이다.
class컴포넌트의 componentDidMount와 componentDidUpdate를 합친 형태
아래는 useEffect가 어떻게 동작되는지 보기위한 예시 코드이다. 순서는 다음과 같다.
cleanup
함수의 동작을 본다....
function MyComp() {
const [name, setName] = useState<string>('');
const onChangeName = (e: React.ChangeEvent<HTMLInputElement>) => {
setName(e.target.value);
};
return (
<>
<div>
<input type="text" value={name} onChange={onChangeName} />
</div>
<div>
<p>이름 : {name}</p>
</div>
</>
);
}
export default MyComp;
function App() {
const [visible, setVisible] = useState(true);
return (
<>
{visible && <MyComp />}
<button
type="button"
onClick={() => {
setVisible(!visible);
}}
>
{visible ? '숨기기' : '보이기'}
</button>
</>
);
}
export default App;
// ...
useEffect(() => {
console.log('마운트될 때만 실행됨')
return () => {
console.log('언마운트될 때만 실행됨')
}
}, [])
숨기기
버튼을 눌러서 컴포넌트를 언마운트 시켜보면, 아래처럼 언마운트 되기 전 return문 내부의cleanup함수를 실행한다. 이는 배열에 상태값을 넣어도 동일하게 작동한다.위처럼 의존성 배열이 비어있을 때는 처음 컴포넌트가 새롭게 생성되는 시점에 한 번 실행된다. 그래서 아래의 코드처럼 백엔드 서버에 데이터를 요청할 때 fetch(or axios) 작업을 한다.
useEffect(() => {
fetchUser() // <- 마운트될 때 데이터 받아오기
}, [])
// ...
useEffect(() => {
console.log('상태값이 업데이트될 때 실행됨')
console.log(상태 값)
return () => {
console.log('상태가 업데이트 되기 전 / 언마운트 되기 전 실행됨')
console.log(상태 값)
}
}, [상태 값]) // <- 의존성 배열에 상태값 존재
위의 코드를 정리하자면, 다음과 같은 순서로 useEffect가 동작한다.