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.jsimport React, { useState } from"react";import Header from"./components/header";import Contents from"./components/contents";import Footer from"./components/footer";functionApp() {const [todos,setTodos] =useState([ { id:Date.now(), text:"리액트 공부하기", isDone:false }, { id:Date.now(), text:"밥 먹기", isDone:true } ]);consthandleAdd= text => { setTodos([ // 기존의 데이터와 text 를 바탕으로 만들어진 새로운 todo 를 합칩니다...todos, { id:Date.now(), text, isDone:false } ]); };return ( <div> <HeaderonChange={handleAdd} /> <Contentstodos={todos} /> <Footer /> </div> );}exportdefault App;
이제 Header 를 만들어보겠습니다. Header 는 text 라는 State 를 가지고 있고 이 State 는 Input 에 값에 따라 변경됩니다.