useEffect란 함수형 컴포넌트에서도 생명주기 메서드를 사용할 수 있게 해준다. 컴포넌트가 렌더링 될 때마다 실행되는 함수, 컴포넌트가 언마운트 될 때 실행되는 함수 등을 정의 할 수 있다.
훅 이야기가 나오면 생명주기라는 단어가 꼭 등장하는데 이참에 자세히 알아보자
useEffect(() => {
// 컴포넌트가 마운트될 때 실행되는 코드
}, []);
useEffect(() => {
// 상태(state)나 프롭스(props)가 변경될 때 실행되는 코드
}, [state, props]);
useEffect(() => {
return () => {
// 컴포넌트가 언마운트될 때 실행되는 코드
};
}, []);
여기서 계속 언급되는 렌더링과 마운트 두개의 차이점은 뭘까? 얼핏보면 비슷한 말인것 같다는 생각이 들었다.
렌더링
컴포넌트의 상태(State)가 변경될 때, 그리고 props가 변경될 때 발생한다. 즉, 컴포넌트의 UI가 변경되고 화면에 렌더링된다.
마운트
React 요소가 브라우저 상에 실제 DOM 노드로 추가될 때 발생한다. 즉, 컴포넌트가 처음 생성될 때 한 번 발생한다.
정리를 해보자면마운트
는 컴포넌트의 초기 생성과 관련이 있으며,렌더링
은 컴포넌트의 상태나 속성 등이 변경될 때 발생한다.
useEffect는 기본적으로 비동기로 실행된다. 따라서 순서가 중요한 작업에는 순서가 보장되지 않는다. 이를 해결하기 위해서는 useEffect 내부에서 async/await를 사용하거나, Promise.all 등을 사용하여 작업을 조정 할 수 있다.
import { useState, useEffect } from 'react';
function MyComponent() {
const [data, setData] = useState([]);
useEffect(() => {
async function fetchData() {
const response = await fetch('https://jsonplaceholder.typicode.com/todos');
const data = await response.json();
setData(data);
}
fetchData();
}, []);
useEffect(() => {
console.log('Data:', data);
}, [data]);
return <div>My Component</div>;
}
export default MyComponent;