컴포넌트가 렌더링된 이후에 실행되는 코드 (부수효과, Side Effect)를 작성하기 위한 React Hook이다.
React의 생명주기(lifecycle) 개념과 직결된 Hook이다.
💡 부수효과?
- 데이터 불러오기
- 브라우저의 로컬 스토리지에 값을 저장
console에log를 출력- DOM 이벤트 등록
컴포넌트 외부 세계에 영향을 주는 행위 -> 렌더링 이후에 어떤 일을 할지 React에게 알려주는 역할
useEffect(() => {
// 실행할 코드
}, [의존성]);
() => { ... } : 실제로 실행할 함수를 작성하는 부분[의존성] : 언제 함수가 실행될지 결정하는 부분useEffect(() => {
console.log('렌더링될 때마다 실행');
});
State(상태) 가 바뀔 때마다 계속 실행useEffect(() => {
console.log('컴포넌트가 처음 마운트될 때 한 번만 실행됩니다!');
}, []);
useEffect(() => {
fetchData(); // 처음 렌더링 시 서버에서 데이터 불러오기
}, []);
useEffect(() => {
console.log('count 값이 바뀔 때마다 실행됩니다!');
}, [count]);
count 값이 변경될 때 마다 실행useEffect(() => {
console.log('이벤트 등록');
window.addEventListener('resize', handleResize);
return () => {
console.log('이벤트 해제');
window.removeEventListener('resize', handleResize);
};
}, []);
return 문은 컴포넌트가 화면에서 사라질 때(언마운트 시) 실행.useEffect(() => {
localStorage.setItem('todos', JSON.stringify(todos));
}, [todos]);
localStorage에서 기존 데이터 불러옴todos가 바뀔 때마다 다시 저장💡
localStorage/JSON.stringify
localStorage: 브라우저가 제공하는 작은 데이터 저장소
-> 페이지 새로고침해도 데이터 삭제 XJSON.stringify(): 자바스크립트 객체 (object) -> 문자열JSON.parse(): 문자열 -> 자바스크립트 객체 (object)
처음 사용 시 의존성 배열을 잘못 다루는 실수를 자주 함.
useEffect(() => {
setCount(count + 1);
});
렌더링 -> count 변경 -> 다시 렌더링 -> useEffect 실행 -> 다시 count 변경
- 무한 렌더링 발생
useEffect(() => {
setCount(count + 1);
}, []); // mount 시 1회만 실행
useEffect(() => {
console.log(count);
}, [count]); // count가 변할 때만 실행
useEffect는 컴포넌트가 렌더링된 후, 특정 상황에서 실행할 코드를 등록하는 Hook 이다.
빈칸 : 렌더링 될 때 마다[] : 처음 한 번만[state] : 특정 값이 바뀔 때return : 정리(Clean-up) 함수