반응형
useEffect
useEffect
는 React의 Hook 중 하나로, 컴포넌트가 렌더링된 이후에 어떤 작업을 수행하기 위해 사용됩니다. useEffect
는 클래스형 컴포넌트의 생명주기 메서드인 componentDidMount
, componentDidUpdate
, componentWillUnmount
를 함수형 컴포넌트에서도 사용할 수 있도록 해줍니다. 주로 다음과 같은 용도로 사용됩니다:
- 데이터 가져오기:
- API 호출을 통해 데이터를 가져올 때 사용됩니다.
- 구독 설정 및 해제:
- 웹소켓 연결이나 이벤트 리스너를 설정하고, 컴포넌트가 언마운트될 때 이를 정리하는 데 사용됩니다.
- DOM 업데이트:
- 컴포넌트가 렌더링된 후 DOM을 직접 조작해야 하는 경우 사용됩니다.
- 타이머 설정:
setTimeout
또는setInterval
을 설정하고 이를 정리할 때 사용됩니다.
useEffect
는 다음과 같은 형식으로 사용됩니다:
import React, { useEffect } from 'react';
const MyComponent = () => {
useEffect(() => {
// 여기서 작업을 수행합니다.
return () => {
// 이 함수는 컴포넌트가 언마운트될 때 실행됩니다.
// 또는 의존성 배열의 값이 변경될 때 이전 effect를 정리합니다.
};
}, []); // 의존성 배열
return (
<div>
{/* 컴포넌트 내용 */}
</div>
);
};
위 코드에서 useEffect
는 다음과 같은 부분으로 구성됩니다:
- 첫 번째 인자: 효과 함수 (effect function)
- 이 함수는 컴포넌트가 렌더링된 후 실행됩니다.
- 두 번째 인자: 의존성 배열 (dependency array)
- 이 배열에 지정된 값이 변경될 때마다 효과 함수가 다시 실행됩니다.
- 빈 배열
[]
을 전달하면, 이 효과는 컴포넌트가 처음 마운트될 때 한 번만 실행됩니다.
예제
- 데이터 가져오기 예제:
import React, { useState, useEffect } from 'react';
const DataFetchingComponent = () => {
const [data, setData] = useState([]);
useEffect(() => {
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const result = await response.json();
setData(result);
};
fetchData();
}, []); // 빈 배열이므로 컴포넌트가 처음 마운트될 때만 실행됨
return (
<div>
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
};
export default DataFetchingComponent;
- 타이머 설정 예제:
import React, { useState, useEffect } from 'react';
const TimerComponent = () => {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => {
setCount(prevCount => prevCount + 1);
}, 1000);
return () => {
clearInterval(timer); // 컴포넌트가 언마운트될 때 타이머 정리
};
}, []); // 빈 배열이므로 컴포넌트가 처음 마운트될 때만 실행됨
return (
<div>
{count}
</div>
);
};
export default TimerComponent;
이렇게 useEffect
를 사용하면 함수형 컴포넌트에서도 다양한 부수 효과(side effects)를 처리할 수 있습니다.
반응형
'프로그래밍' 카테고리의 다른 글
[Ubuntu] mariaDB 설치 (0) | 2024.06.08 |
---|---|
[MongoDB] 접속 에러 (IP whitelist) (0) | 2024.06.07 |
[JavaScript] Named Export와 Default Export의 차이점 (0) | 2024.06.06 |
[JavaScript ES6] 객체 구조 분해 할당 (Destructuring Assignment) (0) | 2024.06.05 |
[Tailwind CSS] css가 적용 안 되는 문제 (+ Daisy UI) (0) | 2024.06.05 |
댓글