Facebook의 React 상태 관리 라이브러리
npm install recoil
현재는 로컬 상태로 구현되어 있습니다. 패키지 설치 후 코드 주석을 해제하세요.
할 일이 없습니다
import { atom } from 'recoil';
// Todo 리스트 상태
const todoListState = atom<Todo[]>({
key: 'todoListState', // 유니크한 ID
default: [], // 기본값
});
// 필터 상태
const todoListFilterState = atom<'all' | 'active' | 'completed'>({
key: 'todoListFilterState',
default: 'all',
});
// 컴포넌트에서 사용
function TodoList() {
const [todos, setTodos] = useRecoilState(todoListState);
const addTodo = (text: string) => {
setTodos([...todos, {
id: Date.now(),
text,
completed: false
}]);
};
return <div>...</div>;
}import { selector } from 'recoil';
// 필터링된 Todo 리스트 (파생 상태)
const filteredTodoListState = selector({
key: 'filteredTodoListState',
get: ({ get }) => {
const filter = get(todoListFilterState);
const list = get(todoListState);
switch (filter) {
case 'completed':
return list.filter((item) => item.completed);
case 'active':
return list.filter((item) => !item.completed);
default:
return list;
}
},
});
// 통계 (파생 상태)
const todoListStatsState = selector({
key: 'todoListStatsState',
get: ({ get }) => {
const todoList = get(todoListState);
const totalNum = todoList.length;
const completedNum = todoList.filter((item) => item.completed).length;
const activeNum = totalNum - completedNum;
return { totalNum, completedNum, activeNum };
},
});
// 컴포넌트에서 사용
function TodoStats() {
const stats = useRecoilValue(todoListStatsState);
return (
<div>
<div>전체: {stats.totalNum}</div>
<div>완료: {stats.completedNum}</div>
<div>진행 중: {stats.activeNum}</div>
</div>
);
}import { selector, useRecoilValue } from 'recoil';
// 사용자 정보 비동기 조회
const userInfoQuery = selector({
key: 'userInfoQuery',
get: async ({ get }) => {
const userId = get(currentUserIdState);
const response = await fetch(`/api/users/${userId}`);
return response.json();
},
});
// Suspense와 함께 사용
function UserInfo() {
const userInfo = useRecoilValue(userInfoQuery);
return (
<div>
<h2>{userInfo.name}</h2>
<p>{userInfo.email}</p>
</div>
);
}
function App() {
return (
<RecoilRoot>
<Suspense fallback={<div>Loading...</div>}>
<UserInfo />
</Suspense>
</RecoilRoot>
);
}