본문 바로가기
Programming

React TODO 리스트 + 라우팅

by 나무수피아는 지식의 가지를 뻗어가는 공간입니다. 2025. 11. 2.
반응형

🧩 TODO 리스트 + 라우팅

이 실습에서는 할 일 목록(TODO List)을 구현하고, React Router를 통해
“전체 할 일”과 “완료된 항목”을 페이지처럼 분리해 보겠습니다.

1. 설치: React Router

npm install react-router-dom

2. 전체 코드 구조

  • App.js: 라우팅 설정
  • TodoList.js: 전체 할 일 보기
  • CompletedList.js: 완료된 할 일 보기
  • TodoInput.js: 할 일 추가

3. App.js

import React, { useState } from 'react'; import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom'; import TodoList from './TodoList'; import CompletedList from './CompletedList'; import TodoInput from './TodoInput'; function App() { const [todos, setTodos] = useState([]); const addTodo = (text) => { setTodos([...todos, { id: Date.now(), text, completed: false }]); }; const toggleComplete = (id) => { setTodos(todos.map(todo => todo.id === id ? { ...todo, completed: !todo.completed } : todo )); }; return ( <Router> <div style={{ padding: '20px' }}> <h2>TODO 리스트</h2> <nav> <Link to="/" style={{ marginRight: '10px' }}>전체</Link> <Link to="/completed">완료됨</Link> </nav> <TodoInput addTodo={addTodo} /> <Routes> <Route path="/" element={<TodoList todos={todos} toggleComplete={toggleComplete} />} /> <Route path="/completed" element={<CompletedList todos={todos} toggleComplete={toggleComplete} />} /> </Routes> </div> </Router> ); } export default App;

4. TodoInput.js

import React, { useState } from 'react'; function TodoInput({ addTodo }) { const [text, setText] = useState(''); const handleSubmit = (e) => { e.preventDefault(); if (!text.trim()) return; addTodo(text); setText(''); }; return ( <form onSubmit={handleSubmit}> <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="할 일을 입력하세요" /> <button type="submit">추가</button> </form> ); } export default TodoInput;

5. TodoList.js

import React from 'react'; function TodoList({ todos, toggleComplete }) { return ( <ul> {todos.map(todo => ( <li key={todo.id} style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}> {todo.text} <button onClick={() => toggleComplete(todo.id)}> {todo.completed ? '취소' : '완료'} </button> </li> ))} </ul> ); } export default TodoList;

6. CompletedList.js

import React from 'react'; function CompletedList({ todos, toggleComplete }) { const completed = todos.filter(todo => todo.completed); return ( <ul> {completed.map(todo => ( <li key={todo.id} style={{ textDecoration: 'line-through' }}> {todo.text} <button onClick={() => toggleComplete(todo.id)}>취소</button> </li> ))} </ul> ); } export default CompletedList;

✅ 정리

  • React Router를 활용하여 라우팅을 학습
  • 상태를 부모 컴포넌트에서 공유하고 자식에 전달
  • 컴포넌트 분리와 상태 제어의 실전 예제

📌 확장 아이디어: 로컬 스토리지 저장, 날짜 필터, 수정 기능 등 추가해 보세요!

반응형

'Programming' 카테고리의 다른 글

React Recoil vs Zustand  (69) 2025.11.04
React Redux Toolkit  (78) 2025.11.03
React 폼 처리와 유효성 검사  (55) 2025.11.01
React 상태관리 도구 비교 (Context vs Redux)  (75) 2025.10.31
React Router  (73) 2025.10.30