일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 해외계좌송금
- 영국개발자취업
- whereanna
- 영국개발자
- 영국 집구하기
- 영국신입개발자
- 해외송금한도
- 영국워홀준비물
- 영국워홀취직
- whereanna_dev
- 영국워홀짐싸기
- whereannadev
- 개발자취업
- 해외송금
- 개발자
- 내일배움캠프
- 런던개발자
- 주니어개발자
- 레볼루트 계좌
- 브랜든파우치
- 영국워홀취업
- 모인 송금
- 모인유학비송금
- 영국워홀
- 워홀취직
- 영국 월세
- 영국송금
- 해외취업
- 신입개발자
- 영국취업
- Today
- Total
Whereanna is everywehre
[프로젝트] 로컬스토리지를 활용한 투두리스트 앱 만들기 - React, JS, Styled-components (다중선택박스) 본문
[프로젝트] 로컬스토리지를 활용한 투두리스트 앱 만들기 - React, JS, Styled-components (다중선택박스)
whereanna_dev 2025. 2. 12. 09:55
투두리스트는 밥먹듯이 할 줄 알아야 하는 기본 중에 기본이기때문에 간단한 투두리스트 앱을 주중에 매일 한번씩 만들어보고 있다.
기능:
- Add todo
- Delete todo (개별)
- Edit Todo (개별)
- Search Todo
- Done/Backlog Status Change (개별)
02/11
기존에는 투두리스트 아이템마다 체크박스를 넣어 삭제 버튼을 누르면 삭제되는 식으로 진행했는데, 전체선택/전체해제 기능이 있으면 편할것 같아 추가했다.
State 추가
const [isSelectedAll, setIsSelectedAll] = useState(false);
JSX 프론트엔드
<MasterCheckBox
onChange={handleCheckAll}
checked={isSelectedAll === true}
type="checkbox"
/>
로직
const handleCheckAll = () => {
// Check if todoList exist
if (!todoList) return;
// Get all ids of todoList
const allTodoIds = todoList?.map((todo) => todo.id);
const isAllTodoChecked = allTodoIds?.every((id) =>
selectedIdList.includes(id)
);
if (isAllTodoChecked) {
// Empty All
setSelectedIdList([]);
setIsSelectedAll(false);
} else {
// Add All
setSelectedIdList(allTodoIds);
setIsSelectedAll(true);
}
};
몇번의 시행착오가 있었는데, setSelectedIdList(allTodoIds) 의 형태는 기존에 selectedIdList에 어떤 아이템들이 들어있건 그냥 allTodoIds로 전체를 새로 갈아끼는 방식. 내가 처음에 접근했던 방식은, 기존에 selectedIdList에 있던 아이템들을 제외하고 allTodoIds 중에서 없는 애들을 따로 spread operator로 넣어주는 생각을 했는데 아래 코드를 보면,,
// 2nd try
const setAllTodoIds = new Set(allTodoIds);
const setSelectedIds = new Set(selectedTodoIdList);
const thingsToAdd = setAllTodoIds.intersection(setSelectedIds);
setIsAllTodosChecked(true);
setSelectedTodoIdList([...selectedTodoIdList, thingsToAdd]);
// 3rd try
const thingsToAdd = allTodoIds.filter((id) => !selectedId.includes(id));
setIsAllTodosChecked(true);
setSelectedTodoIdList([...selectedTodoIdList, thingsToAdd]);
두번째는 javascript docs 보고 set 적용하려다가 실패.
세번째로도 구현이 가능했으나, 찾아보니
=> 리액트에서는 setState()를 최소한으로 호출하는 것이 중요하지만, 비교 연산이 비효율적이라면 차라리 한 번에 교체하는 게 낫다고 한다. thingsToAdd를 구하는 filter() 연산이 많아지면 오히려 성능이 떨어질 가능성이 크고 , 따라서 그냥 setSelectedTodoIdList(allTodoIds)를 사용하는 것이 성능적으로 더 효율적이다. 만약 성능 최적화가 정말 필요하면 React의 useMemo()나 useCallback()을 활용하는 방법도 고려할 수 있다고 한다.
Deployed URL
https://dailytodoapp-delta.vercel.app/
React App
dailytodoapp-delta.vercel.app
'Dev' 카테고리의 다른 글
Headless CMS(Headless Content Management System) (1) | 2024.04.12 |
---|