todoList.forEach((todo) => {
if (!todo.isDone) { //todo.state로 되어있었다...
workList.push(todo);
} else if (todo.isDone) { //todo.state로 되어있었다...
doneList.push(todo);
}
});
두 가지 리스트를 나누는 방법 리팩토링
기존: todoList를 만들고 이를 workList와 doneList로 나누는 방식을 사용했다
조언: 시간 복잡도에서 n이 크지 않은 경우 가독성이 높게 filter를 2번 쓰는 방식을 사용했다.
// 수정 전 방식
let workList = [];
let doneList = [];
todoList.forEach((todo) => {
if (!todo.isDone) {
workList.push(todo);
} else if (todo.isDone) {
doneList.push(todo);
}
});
// 수정 후 방식
const workList = todoList.filter(todo => !todo.isDone)
const doneList = todoList.filter(todo => todo.isDone)
비즈니스 로직과 뷰 분리할 수 있게 리팩토링
- Card.jsx에서 todoList를 관리하거나 알 필요가 없어진다.
- 제일 상위 컴포넌트인 App.jsx에서 todoList와 관련된 비즈니스 로직을 모두 처리한다.
//기존 Card.jsx
function Card({ id, todoList, setTodoList, title, content }){
function onClickState() {
setTodoList(todoList.map((todo) => todo.id === id ? {...todo, isDone: !todo.isDone}: todo))
}
}
//수정된 Card.jsx
function Card({ id, handleToggleDone, title, content }){
handleToggleDone(id);
}
}
네이밍은 좀 더 직관적으로!