이전 시간에는 Todo를 입력할 수 있는 Form과 입력한 내용들을 보여주는 List를 만들었다. 이제 이 TodoList의 기능을 강의 내용에 따라 좀 더 강화하는 시간을 가져보겠다.
1️⃣ Props Drilling을 이용한 삭제 기능 구현하기
2️⃣ TypeScript에서 Context API의 활용
3️⃣ 프로젝트에서 TypeScript의 기능을 설정하는 tsconfig.json
이전 시간에 학습했던 내용을 참고하여 생성한 Todo
를 삭제하는 기능을 만들어보자.
우선은 Todo를 삭제하려면 다음과 같은 절차를 생각해야한다.
TodoItem
에 onClick
이벤트가 작동해야한다.TodoItem
을 누를 시, 새로고침이 되지 말아야한다. (preventDefault()
)TodoItem
의 Todo
id
를 체크해 동일한 id
를 가진 Todo
를 제외한 새로운 배열을 setTodos
로 적용해줘야 한다.위의 방식을 구현하기 위해, 앞서 onAddToDo
를 구현한 방식과 비슷하게 Props Drilling으로 관련 내용을 아래와 같이 구현해봤다.
import { useState } from "react";
import NewTodo from "./components/NewTodo";
import Todos from "./components/Todos";
import Todo from "./models/todo";
function App() {
const [todos, setTodos] = useState<Todo[]>([]);
const addTodoHandler = (todoText: string) => {
const newTodo = new Todo(todoText);
setTodos([...todos, newTodo]);
};
const deleteTodoHandler = (todoId: string) => {
setTodos(todos.filter((elem) => elem.id !== todoId));
};
return (
<div className="App">
<NewTodo onAddTodo={addTodoHandler} />
<Todos items={todos} onDeleteTodo={deleteTodoHandler} />
</div>
);
}
export default App;
위의 코드에서 Todo
를 추가하는 addTodoHandler
와 같이 Todo
를 지워주는 deleteTodoHandler
함수를 생성했다.
setState
함수인 setTodos
를 통해 현재의 배열 todos
에서 지우고자 하는 Todo
와 동일한 id
를 가진 요소를 지우기 위해 filter
메소드를 통해 새 배열로 만들어냈다.
앞서 class
로 정의한 Todo
에서 id
는 string
으로 정의했으므로, id
를 가져올 매개변수인 todoId
또한 string
으로 정의됐다.
이제 하위 컴포넌트인 Todos.tsx
를 보자.