단순한 Todo 리스트를 넘어, 실무에서 필수적인 상태 제어 기능을 구현해봄.
오늘 공부하면서 가장 큰 의문과 답답함이 밀려왔던 포인트는 두가지
1) 전역 상태 확장 (TodoStore.js)
가장 먼저 공유 수첩(Store)에 새로운 기준을 추가함.
const useTodoStore = create((set) => ({
todos: [],
filter: "all", // 1. 기준값 추가 (전체, 미완료, 완료)
// ... (생략)
setFilter: (filter) => set({ filter }), // 2. 기준값을 바꾸는 리모컨 추가
}));
2) 필터 버튼 컴포넌트 (TodoFilter.jsx)
사용자의 명령을 받는 스위치를 만들었음.
function TodoFilter() {
const { filter, setFilter } = useTodoStore(); // 수첩에서 리모컨 가져오기
return (
<div>
<button onClick={() => setFilter("all")}>전체</button>
<button onClick={() => setFilter("active")}>미완료</button>
<button onClick={() => setFilter("completed")}>완료</button>
</div>
);
}
3) 필터링 로직 구현(TodoList.jsx)
오늘의 가장 중요한 하이라이트
const { todos, filter } = useTodoStore(); // 수첩에서 데이터 가져오기
// 중요! 원본은 건드리지 않고 '보여줄 목록'만 새로 만듭니다 (파생 상태)
const filteredTodos = todos.filter((todo) => {
if (filter === "completed") return todo.completed; // 완료만 통과!
if (filter === "active") return !todo.completed; // 미완료만 통과!
return true; // 전체보기
});
// 화면에는 거른 목록(filteredTodos)을 뿌려줍니다.
{filteredTodos.map((todo, index) => ( ... ))}
이번 프로젝트를 통해 머릿속에 확실히 박힌 3단계 흐름이다.
🐙 GitHub Repository
👉 https://github.com/wjdtor2-design/Frontend-portfolio
📝 Velog Study Log