Open JangAyeon opened 2 years ago
카테고리 명에 따라 id로 API호출하는 방식 value : 화면에 사용자에게 보여줄 카테고리명 key : API 호출 시 사용자가 선택한 카테고리명으로 호출할 id 값
const CategoryArray = [
{ key: 101, value: "소설" },
{ key: 101, value: "시/에세이" },
{ key: 119, value: "인문" },
{ key: 110, value: "아동" },
{ key: 112, value: "청소년" },
{ key: 117, value: "경제경영" },
{ key: 118, value: "자기계발" },
{ key: 122, value: "컴퓨터/인터넷" },
{ key: 115, value: "국어/외국어" },
{ key: 200, value: "외국도서" },
{ key: 428, value: "블루레이" },
{ key: 400, value: "CD/DVD" },
];
map 함수로 카테고리 버튼 생성
<ul className="list">
{CategoryArray.map((Category) => (
<li
onClick={(e) => {
setActive(e);
}}
value={Category.key}
>
{Category.value}
</li>
))}
</ul>
이전 클릭 카테고리와 현재 클릭 카테고리 비교할 state 선언
const [CurrentClick, setCurrentClick] = useState(CategoryArray[0].key); //카테고리 중 첫번째 default로
const [PrevClick, setPrevClick] = useState(null); //처음에는 이전 선택 없음
클릭 발생 시 클릭 li의 value로 CurrentClick의 state 설정
const setActive = (e) => {
setCurrentClick(e.target.value);
};
현재 선택한 li 태그에 선택한 li 태그 class에 active 제거 & 이전에 선택한 li 태그 class에 active 제거
useEffect(
(e) => {
if (CurrentClick !== null) { //클릭을 통해 받은 카테고리 key
console.log(CurrentClick);
let current = document.querySelector(
`div.Category ul.list li[value="${CurrentClick}"]`
); //클릭한 카테고리의 key를 value 속성으로 가진 li 받아오기
console.log("curr_click", current);
current.setAttribute("class", "active"); //li .태그 속성 중 class에 active 부여
}
if (PrevClick !== null) { //이전에 선택한 카테고리가 있는 경우
console.log(PrevClick);
let prev = document.querySelector(
`div.Category ul.list li[value="${PrevClick}"]`
); //이전의 선택 카테고리 key 값인 PrevClick과 li 태그 내 value를 이용해 DOM 가져오기
console.log("prev_click", prev);
prev.setAttribute("class", "");
//이전 선택으로 class에 부여된 active 삭제
}
setPrevClick(CurrentClick);
//현재 클릭한 카테고리 key를 Prevclick 설정
/*(다음번 새로운 카테고리 선택 발생 시 해당 PrevClick 값을 이용해 li 태그 받아옴 -> li 태그 속성의 class에 부여된 acitve 삭제*/
},
[CurrentClick]
);
CSS 부여
li {
display: block;
color: $txt-dark-gray;
background-color: $bg-gray-1;
line-height: 16px;
margin: 0px 5px 20px;
padding: 10px 20px;
border-radius: 22px;
&:hover {
cursor: pointer;
color: $bg-sub-purple;
background-color: $bg-light-purple;
}
}
li.active {
color: $main-white;
background-color: $main-purple;
}
한 줄에 3개씩 나열
.Grid {
@include CenterContainer();
@include flexCenter();
display: grid;
/* 3개씩 반복해서 배열 */
grid-template-columns: repeat(3, auto);
/* 간격 조정 */
gap: 0px 5%;
}
책 각기 다른 이미지 사이즈 조절 이미지 div 높이 지정하고 너비는 grid에 조정한 값을 100% 채우기
.Item_img {
height: 435px;
img {
object-fit: cover;
width: 100%;
height: 100%;
}
}
}
사진 아래 텍스트가 div에 담겨 서로 정렬이 어긋남 align-items: start; 를 통해 세로 정렬 기준 설정 (위쪽 맞춤)
⭐ 재사용성 높은 요소는 컴포넌트형으로 관리