React Hooks 가이드
React Hooks는 함수형 컴포넌트에 상태 관리와 생명주기 기능을 도입한 혁신적인 기능입니다.
1. useState: 상태 관리의 기본
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>현재 카운트: {count}</p>
<button onClick={() => setCount(count + 1)}>증가</button>
<button onClick={() => setCount(prevCount => prevCount - 1)}>감소</button>
</div>
);
}
2. useEffect: 생명주기와 부수 효과 관리
import React, { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState(null);
useEffect(() => {
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const result = await response.json();
setData(result);
}
fetchData();
}, []); // 빈 의존성 배열: 최초 1회만 실행
return <div>{/* 데이터 렌더링 */}</div>;
}
3. useContext: 컴포넌트 간 상태 공유
import React, { createContext, useContext, useState } from 'react';
const ThemeContext = createContext();
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
}
function ThemedComponent() {
const { theme, setTheme } = useContext(ThemeContext);
return (
<div>
<p>현재 테마: {theme}</p>
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
테마 전환
</button>
</div>
);
}
4. useReducer: 복잡한 상태 관리
import React, { useReducer } from 'react';
function todoReducer(state, action) {
switch (action.type) {
case 'ADD_TODO':
return [...state, {
id: Date.now(),
text: action.payload,
completed: false
}];
case 'TOGGLE_TODO':
return state.map(todo =>
todo.id === action.payload
? { ...todo, completed: !todo.completed }
: todo
);
default:
return state;
}
}
function TodoList() {
const [todos, dispatch] = useReducer(todoReducer, []);
const addTodo = (text) => {
dispatch({ type: 'ADD_TODO', payload: text });
};
return (
<div>
{/* Todo 목록 렌더링 로직 */}
</div>
);
}
주의사항
- Hooks는 함수형 컴포넌트의 최상위 레벨에서만 호출
- 조건문, 반복문, 중첩 함수 내에서 Hooks 사용 금지
- 성능 최적화를 위해
useMemo
,useCallback
적절히 활용
결론
React Hooks는 컴포넌트 로직을 더 간결하고 재사용 가능하게 만들어줍니다. 각 Hook의 특성을 잘 이해하고 적절히 활용하세요.