const [newtodo,setnewTodo]=useState("")
const [todos,setTodos]=useState([
{text:'할일하기',id:0,complete:false},
{text:'설거지',id:1,complete:false},
{text:'밥하기',id:2,complete:true}
])
id
값 없이 index
로 하게되면 수정 삭제가 까다로워 집니다.id
값을 쉽게 만드는 방법은 바로 아래 추가하기 부분에서 적겠습니다.const onChange = (e)=>{
setnewTodo(e.target.value)
}
const onClick = ()=>{
const newTodos = [...todos,
{text:newtodo,id:Date.now(),complete:false}
]
setTodos(newTodos)
setnewTodo('')
}
input
을 적을 때마다 onChange
로 바꿔줘야합니다.todos
를 만들어 예전 것을 copy하고 새로운 todo
의 값들로 object
형태로 만들어 줍니다.id
만들기 : Date.now()
를 사용하게 되면 쉽게 독자적인 id
생성 가능하다.setTodos
로 만들어 놓은 newTodos
로 바꿔주게 되고 input
값을 비워준다.const deleteTodo = (index)=>{
const newTodos = todos.filter(todo=>(todo.id!==index))
setTodos(newTodos)
}
todos
에서 filter
를 이용해서 index
번호가 아닌것들을 다시 저장한다.todos
를 그 값들로 다시 만들어준다.const onComplete = (index)=>{
setTodos(todos.map(todo=>
todo.id === index ? {...todo,complete:!todo.complete}:todo))
}
todos
를 map
을 사용해 하나하나 index
를 확인 후 그 값이 아니면 그대로 ,
그 값이라면 todo
내용 그대로 복사후 complete
만 바꿔준다.
const todolist = todos.map(todo =>
<li className={todo.complete&&"complete"}
key={todo.id}
onClick={()=>onComplete(todo.id)}
onDoubleClick={()=>deleteTodo(todo.id)}
>
{todo.text}
</li>)
}
return (
<div>
<input
onChange={onChange}
onKeyPress={(e)=>{if(e.key==='Enter'){onClick()}}}
value={newtodo} type="text" placeholder='Write todo'/>
<button onClick={onClick}>추가하기</button>
<ul>{todolist}</ul>
</div>
);
className
주는법 todo
의 complete
가 true
이면 class
에 complete
가 부여된다.input
의 엔터키 누르는 법 →onKeyPress={(e)=>{if(e.key==='Enter'){onClick()}}}
enter
’이면 함수를 실행 시킨다.ul > .complete {
text-decoration: line-through;
color: aquamarine;
}
ul
안의 li
가 complete
라는 class
를 갖는다면 저 스타일 실행된다