Effitizer 프로젝트 메인 화면의 카테고리 필터 구현에 성공했다. 경우의 수가 많지 않아서 금방 만들 수 있을 줄 알았는데 코드 에디터에서 바로 하려니 생각보다 잘 안 돼서 종이에 써 가면서 했다. 쓰다보니 분기가 3 depth까지 내려간다는 걸 알게 되었다.
변수는 총 2가지이다.
1. 클릭한 카테고리의 인덱스 -> 0인지 아닌지
2. 클릭한 카테고리의 인덱스들이 담긴 배열 -> 0을 포함하는지 아닌지
분기가 발생하는 로직은 총 4가지이다.
여기서 0은 '전체' 카테고리를 뜻한다.
(촬영: 'CamScanner' 앱 사용)
'클릭한 인덱스'는 클릭한 카테고리의 인덱스이고,
'클릭한 배열'은 클릭한 카테고리의 인덱스들이 담긴 배열이다.
제일 먼저 '클릭한 배열'에 0이 있는지 여부로 크게 나뉜다.
그리고 2번의 두 번째 경우( '2)' )에서 두 가지 분기로 나뉜다.
특정 카테고리 클릭 시 handleCategoryClick을 실행한다. (styles는 SCSS 코드)
<div className={styles.categoryList}>
{categories?.map(({ id, name }) => (
<div
key={id}
className={classNames(
styles.categoryButton,
clickedCategories.map(
(clickedIndex) =>
clickedIndex === id - 1 && styles.clickedCategory
)
)}
onClick={() => handleCategoryClick(id - 1)}
>
{name} // 카테고리 이름 (음악, 경제, .. )
</div>
))}
</div>
const handleCategoryClick = (clickedIndex: number) => {
if (clickedCategories.includes(0)) {
if (clickedIndex === 0) {
return;
} else {
setClickedCategories([
...clickedCategories.filter((clicked) => clicked !== 0),
clickedIndex,
]);
}
} else {
if (clickedIndex === 0) {
setClickedCategories([0]);
} else {
if (clickedCategories.includes(clickedIndex)) {
setClickedCategories([
...clickedCategories.filter((clicked) => clicked !== clickedIndex),
]);
} else {
setClickedCategories([...clickedCategories, clickedIndex]);
}
}
}
};
종이에 로직을 적어보니 변경되는 요소와 변경할 로직이 명확해져서 금방 구현할 수 있었다. 에디터에서만 코딩할 때는 계속 제자리만 돌고 진도가 안 나가는 느낌이었는데 역시 손노동이 짱이다.