09. TODO APP (DELETE)
Todo APP 을 만들어봅니다
들어가기전에
이번 내용은 08. TODO APP (Read, Create) 와 이어집니다. 이전에는 Todo 를 추가하는 방법에 대해 학습했습니다. 이번 챕터에서는 추가된 데이터를 삭제하는 방법에 대해 학습합니다.
실습
이전 Input 에서 추가한 text 를 App.js 에게 전달하여 데이터를 추가했던 방법을 기억하시나요 ? 데이터의 삭제도 비슷한 흐름으로 이루어집니다. event 는 Contents 에서 일어나지만 실제 데이터의 변화는 App.js 에서 일어납니다.
Delete Function 추가
먼저 App.js 에 데이터를 삭제하는 함수를 추가해보겠습니다. 삭제를 하는 방법은 여러가지 방법이 존재하지만 우리는 array 의 filter 를 이용해서 삭제를 해보겠습니다. 함수는 매우 간단합니다. contents 에서 눌린 Todo 의 id 를 넘겨주면 App.js 에서는 넘겨받은 id 와 다른 Todo 들만 필터링해서 데이터를 변경하면 됩니다.
// App.js
import React, { useState } from "react";
import Header from "./components/header";
import Contents from "./components/contents";
import Footer from "./components/footer";
function App() {
const [todos, setTodos] = useState([]);
const handleAdd = text => {
setTodos([
...todos,
{
id: Date.now(),
text,
isDone: false
}
]);
};
const handleDelete = id => { // Contents 에게 넘겨줄 todo 를 삭제하는 함수
setTodos(todos.filter(todo => todo.id !== id));
};
return (
<div>
<Header onChange={handleAdd} />
<Contents todos={todos} onDelete={handleDelete} />
<Footer />
</div>
);
}
export default App;
Todo 삭제
Contents 에서는 부모로부터 넘겨받은 onDelete 라는 함수에게 눌린 Todo 의 id 를 넘겨줄거에요
// src/components/contens.js
import React from "react";
function Todo({ todo: { id, text, isDone }, onDelete }) {
return (
<div>
<input type="checkbox" checked={isDone} />
<span>{text}</span>
<button onClick={() => onDelete(id)}>DELETE</button>
</div>
);
}
function Contents({ todos, onDelete }) {
return (
<div>
{todos.map(todo => (
<Todo todo={todo} onDelete={onDelete} key={todo.id} />
))}
</div>
);
}
export default Contents;
App.js 에서 받은 함수를 Contents 로 넘겨주고 Contents 가 Todo 로 다시 한번 넘겨줍니다. 그리고 Todo 에서는 클릭되었을 때 넘겨받은 함수로 id 를 넘겨줍니다. 이 처럼 부모에 있는 데이터를 다루기 위해서 함수를 넘기다보면 Component 들의 깊이가 깊어질수록 같은 함수를 여러번 넘기게 되는 일이 발생합니다. 지금은 두 번 정도라 한 눈에 보이지만 조금만 더 복잡해지더라도 흐름을 따라가는게 벅찹니다. => Header, Contents, Footer 에서 같은 Todo List 를 필요로 하기 때문에 이 모든걸 감싸고 있는 App.js 로 함수가 몰리기 때문에 발생하는 일 입니다.
이를 해결하기 위해서는 Global 하게 State 를 관리 할 수 있는 수단이 필요합니다. 대표적으로 많이 쓰이는것이 Redux, Mobx 같은 라이브러리입니다. 우리는 뒤쪽에서 Context API 를 이용하여 이러한 문제를 풀어보려고합니다.

Last updated
Was this helpful?