Checkbox 의 상태는 isDone 에 영향을 받습니다. 여기까지하면 일단 Read 는 다 했습니다.
위 처럼 map 같이 loop 를 돌면서 Component 를 그려줄 때는 항상 고유한 key 값이 필요합니다.
=> 지금은 샘플 데이터가 Date.now 를 동시에 호출해서 만들기 때문에 경고가 납니다. 뒤에 샘플 데이터를 제거하면 경고가 사라질거에요
Todo 추가
이제 Input 에 적은 글을 바탕으로 새로운 Todo 를 만들어내는 것을 해야합니다.
그 전에 생각해보아야 할 것이 있습니다.
Input 은 Header 에 있고 Todo List 의 State 는 App.js 즉 부모에 있습니다.
=> 즉, 자식에서 만든 데이터를 부모의 데이터에 추가해야 되는 일이 발생한 것 입니다.
=> 이럴때는 보통 데이터를 가지고 있는곳에서 함수를 만들어 자식에게 제공합니다.
=> Todo List 를 가진 App.js 에서 Todos 데이터를 다룰 수 있는 함수를 만들어 자식 Header 에게 제공합니다.
App.js 에 handleAdd 라고 불리는 함수를 추가합니다. 해당 함수는 text 를 받아 새로운 Todo 를 만들고 자신이 가진 todos 에 push 해주는 역할을 합니다. 이 함수를 자식 Header 에게 전달합니다.
=> 보통 내부에서 데이터를 다루는 함수는 handle, 외부에서 넘겨준 event 는 on 이라는 이름을 많이 사용합니다.
// 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([
{
id: Date.now(),
text: "리액트 공부하기",
isDone: false
},
{
id: Date.now(),
text: "밥 먹기",
isDone: true
}
]);
const handleAdd = text => {
setTodos([ // 기존의 데이터와 text 를 바탕으로 만들어진 새로운 todo 를 합칩니다
...todos,
{
id: Date.now(),
text,
isDone: false
}
]);
};
return (
<div>
<Header onChange={handleAdd} />
<Contents todos={todos} />
<Footer />
</div>
);
}
export default App;
이제 Header 를 만들어보겠습니다. Header 는 text 라는 State 를 가지고 있고 이 State 는 Input 에 값에 따라 변경됩니다.