배열의 불변성을 지키면서 배열의 원소를 제거하기 위해 filter를 사용했다.
const todos = [
{
id: 1,
title: 'test1',
content: 'test1',
isDone: true
},
{
id: 2,
title : 'test2',
content: 'test2',
isDone: true
},
{
id: 3,
title: 'test3',
content: 'test2',
isDone: false
},
{
id: 4,
title: 'test4',
content: 'test5',
isDone: false
}
];
const filterResult = todos.filter(todo => todo.isDone === false);
//[
{ id: 3, title: 'test3', content: 'test2', isDone: false },
{ id: 4, title: 'test4', content: 'test4', isDone: false }]
id
: id
를 인자로 받아서 삭제를 시킬 해당 id
값을 가진 요소를 제외하고 배열을 필터링 시켜준다.setTodos
: 필터링된 값을 받아와서 setTodos()
메소드로 변수를 다시 저장한다.const onRemoveTodo = (id) => {
setTodos(todos.filter(todo => todo.id !== id))
}
onRemoveTodo
함수를 props
로 전달한다.return (
<div>
<List todos={todos}
onRemoveTodo={onRemoveTodo}
checkTodo={checkTodo} />
</div>
);
}
function List({ todos, onRemoveTodo, checkTodo }) {
return (
<div>
<div className="form">
<h3 className="title-state">할 일</h3>
<div>
{todos.filter((todo) => !todo.isDone)
.map((progressTodo) => (
<Todo
todo={progressTodo}
key={progressTodo.id}
onRemoveTodo={onRemoveTodo}
checkTodo={checkTodo}
/>
))
}
</div>
</div>
</div>
);
}
const { id, title, content, isDone } = todo;
: 구조 분해할당을 통해 값 추출onClick={() => onRemoveTodo(id)}
onClick={onRemoveTodo(id)}
는 안되는 이유? 렌더링 되는 동시에 onRemoveTodo함수가 바로 실행된다. → 아무것도 렌더링되지 않고 에러메세지 반환할 수 있음onClick={function() {onRemoveTodo(id)}}
표현할 수 있음function Todo({ todo, onRemoveTodo, checkTodo }) {
const { id, title, content, isDone } = todo;
return (
<div className='index'>
<span className='item-list'>{title}-{content}</span>
<div>
<button className='delete-btn' onClick={() => onRemoveTodo(id)}>삭제</button>
{isDone ?
<button className='complete-btn' onClick={() => checkTodo(id)}>취소</button>
: <button className='complete-btn' onClick={() => checkTodo(id)}>완료</button>
}
</div>
</div>
)
}