todo리스트에서 할 일인지, 완료한 일인지 체크하기 위해 filter를 사용해서 isDone인 경우의 데이터만 가져오고, map함수를 사용해서 isDone인 배열안에 담긴 객체들을 돌면서 화면에 뿌려주도록 구현했다.
const arr = [
{key:1, value:10, isDone: true},
{key:2, value:20, isDone: true},
{key:3, value: 30, isDone: false}];
const test = arr.map(function(obj){
let obj2 = {...obj}; // arr의 배열을 전개연산자로 복사해준다.
console.log("obj2",obj2);
obj2.key === 1 ? obj2.isDone = !obj2.isDone : obj2;
return obj2;
}
);
console.log(test);
// [
{ key: 1, value: 10, isDone: false },
{ key: 2, value: 20, isDone: true },
{ key: 3, value: 30, isDone: false }
]
let obj2 = {...obj};
obj2.key === 1 ? obj2.isDone = !obj2.isDone : obj2;
console.log(test);
로 확인id
: id
를 인자로 받는다.todo.id === id
: 인자로 받은 id값과 todo 배열 객체 안에 있는 id를 비교한다.? {...todo, isDone: !todo.isDone}
: todo
setTodos
: 변경시킨 값을 반영시킨다. // 완료하기 버튼
// 완료하기 버튼을 누르면 isDone이 true로 바껴야 함
const checkTodo = (id) => {
setTodos(todos => todos.map(todo =>
(todo.id === id? {...todo, isDone: !todo.isDone} : todo)
)
)
};
checkTodo
함수를 props
로 전달한다.return (
<div>
<List todos={todos}
onRemoveTodo={onRemoveTodo}
checkTodo={checkTodo} />
</div>
);
}
props
를 Todo 할 일을 취소
, 완료
시킬 버튼이 있는 컴포넌트로 다시 전달한다.todos.filter((todo) => !todo.isDone)
!todo.isDone
: 할 일을 해야되는 상태면 할 일에 해당하는 데이터만 Todo 컴포넌트로 넘겨준다.todos.filter((todo) => todo.isDone)
todo.isDone
: 할 일을 완료한 상태라면 완료된 일에 해당하는 데이터만 Todo 컴포넌트로 넘겨준다.<h3 className="title-state">해야할 일 🔥</h3>
<div>
{todos.filter((todo) => !todo.isDone)
.map((progressTodo) => (
<Todo
todo={progressTodo}
key={progressTodo.id}
onRemoveTodo={onRemoveTodo}
checkTodo={checkTodo}
/>
))
}
</div>
<h3 className="title-state">완료한 일 🔥</h3>
<div>
{todos.filter((todo) => todo.isDone)
.map((doneTodo) => (
<Todo
todo={doneTodo}
key={doneTodo.id}
onRemoveTodo={onRemoveTodo}
checkTodo={checkTodo}
/>
))
}
</div>
취소
, 확인
버튼이 있는 onClick에서 실행isDone ?
: isDone(할 일이 완료인 상태)이면 취소 버튼이 나타나도록 구현:
: isDone(할 일인 상태)이면 완료 버튼이 나타나도록 구현onClick={() => checkTodo(id)}
완료
or 취소
하려는 id
를 checkTodo
함수에 넘겨준다.checkTodo
함수가 실행되도록 구현한다.<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>