Use Case
- 메뉴 출력을 N x 2 로 만들고 메뉴 마다 디테일 모달 띄우기
- Sticky Navbar 제작
- How to Eat
디테일 모달
현재 메뉴판은 한 줄로 쭉 나열되어있고 메뉴 카드마다 메뉴명, 메뉴 한국어명, 메뉴 디테일, 가격 이렇게 정보가 한꺼번에 나와있다. 내 생각에는 정보가 한 번에 다 나오면 귀찮은 동작없이 메뉴를 살필 수 있다고 생각하는데 아무래도 메뉴가 하나씩 나오게 되면 사용자 입장에서는 더 많은 스크롤을 내려야 한다. 따라서, N * 2 로 메뉴 리스트를 바꾸고 각 메뉴를 눌렀을 때 디테일 모달이 나오도록 변경하려고 한다.
우선, 모달 띄우기 전 화면에 출력할 내용은 외국어 메뉴명, 한국어 메뉴명, 가격이다. 이후 각 메뉴의 Element 에 onClick 을 부여해 데이터를 모달에 디테일 한 작업을 추가할 예정이다. 추후에 디테일 모달에는 Carousel 을 넣고 싶다.
N x 2의 메뉴
.menu-list {
@apply flex flex-wrap gap-4 justify-center items-center;
}
@media (max-width: 600px) {
.menu-list {
@apply flex-row;
}
}
gap 클래스를 기호에 맞게 수정해 주어 카드간의 간격을 조정하고, .menu-list 클래스에 flex-row로 변경하여 카드가 열별로 출력되게 변경했다.
이제 디테일 모달을 만들차례
만들려고 시도를 하자마자 클릭 이벤트를 넣는데 문제가 발생했다.
어이없는 오류 1 : 부모 Div 안에 모달 넣지말자
문제 상황
처음에는 모달을 열고 닫는 간단한 기능을 구현하려고 했다. MenuItemCard
컴포넌트에서 카드 요소를 클릭하면 모달이 열리고, 모달 내부의 닫기 버튼을 클릭하면 모달이 닫히도록 했다. 코드의 핵심 부분은 다음과 같다.
<div className="rounded-lg shadow-md bg-white overflow-hidden w-72 h-150 card" onClick={handleModalOpen}>
<Image src={imageUrl} alt={name} className="object-cover w-full h-1/2" width={240} height={100} />
<div className="p-4 h-1/2">
<h3 className="text-xl font-extrabold mb-2">{name}</h3>
<div className="text-md font-normal">{discription}</div>
<div className="text-gray-700 card-price">{price}</div>
</div>
{isModalOpen && (
<DetailModal open={isModalOpen} onClose={handleModalClose}>
<div className="flex h-11/12 bg-blue-700"> {/* 모달 내용 */} </div> </DetailModal> )}
</div>
이렇게 보면 당연히! 동작되었을 줄 알았지만 모달창이 영원히 닫히지 않는 문제가 생기게 되었다. 도대체 무엇이 문제였을까?!
문제 원인
문제의 원인은 모달이 부모 div
의 onClick
이벤트에 의해 닫히는 것이었다. 모달을 클릭할 때도 부모 div
의 onClick
이벤트가 호출되면서 setIsModalOpen
함수가 번복되는 상황이 발생했다.
해결 방법
해결 방법은 간단했다. onClick
이벤트를 부모 div
에서 제거하고, 필요한 자식 요소에만 이벤트 핸들러를 설정하면 된다.
이 따위 문제를 2시간 넘게 잡고 있다는 것. 개발자로 살아남아가고 있다는 것.
수정된 코드
<div className="rounded-lg shadow-md bg-white overflow-hidden w-72 h-150 card">
<div onClick={handleModalOpen}>
<Image
src={imageUrl}
alt={name}
className="object-cover w-full h-1/2"
width={240}
height={100}
/>
<div className="p-4 h-1/2" >
<h3 className="text-xl font-extrabold mb-2">{name}</h3>
<div className="text-md font-normal">{discription}</div>
<div className="text-gray-700 card-price">{price}</div>
</div>
</div>
{isModalOpen && (
<DetailModal open={isModalOpen} onClose={()=>handleModalClose()}>
<div className="flex h-11/12 bg-blue-700">
{/* 모달 내용 */}
</div>
</DetailModal>
)}
</div>
결과물
한국어 메뉴일 때는 공백이 매우 신경쓰이는데 일단 디자인 적인 부분은 나중에 신경쓰기로 했다. 깨알 수정안한 맛있게먹는법의 흔적
다음에는 How To Eat 모달을 수정할 예정!
'Project > [Next] 열정도쭈꾸미 외국인 메뉴판' 카테고리의 다른 글
[5] 열정도 쭈꾸미, Carousel 을 적용해보자 (2) | 2024.07.10 |
---|---|
[4] 열정도 쭈꾸미, 최적화를 해보자 (1) | 2024.06.21 |
[3] 열정도 쭈꾸미, 맛있게 먹는 법을 만들어보자 (0) | 2024.06.14 |
[#] 대한민국 통신사 DNS의 .vercel.app 도메인 차단 (0) | 2024.05.19 |
[1] 열정도 쭈꾸미 , 메뉴판 제작 (0) | 2024.05.11 |