-
구현을 마치고 보니 장바구니에서도 수량을 선택해서 업데이트 해주는 로직을 빼먹어서 수량도 조절할 수 있도록 구현해 보았다.
먼저 기존에 수량 컴포넌트 UI를 분리시켜 주는 것 부터 시작했다😊
수량 조절 UI를 담당하는 공통 컴포넌트
//QuantitySelector.tsx const QuantitySelector = ({ className, quantity, increase, decrease, }: QuantitySelectorProps) => { return ( <div className="flex items-center text-sm"> <h3 className={className}>수량</h3> <div className="flex gap-2 items-center"> <button onClick={decrease} disabled={quantity === 1} className={`${ quantity === 1 ? "opacity-50 cursor-not-allowed" : "hover:text-purple" }`} > <CiSquareMinus size={25} /> </button> <p>{quantity}</p> <button onClick={increase} className={`${quantity >= 5 ? "opacity-50 " : "hover:text-purple"}`} > <CiSquarePlus size={25} /> </button> </div> </div> ); }; export default QuantitySelector;
상세페이지 수량 선택 로직
//ProductInfo.tsx const ProductInfo = ({ id }: ShopMenuProps) => { const [count, setCount] = useState(1); const handleIncrease = () => { if (count >= 5) { toast({ title: "최대 5개 까지 구매 가능합니다.", }); return; } setCount((prev) => Math.min(prev + 1, 5)); }; const handleDecrease = () => { if (count > 1) { setCount((prev) => Math.max(prev - 1, 1)); } }; return ( {/* 중략 */} <li className="flex py-3 px-3 border-b"> <QuantitySelector className="w-[100px]" quantity={count} increase={handleIncrease} decrease={handleDecrease} /> </li> ); }; export default ProductInfo;
기존에 사용하고 있던 수량부분을 공통 컴포넌트로 변경했으니 props로 해당 내용을 넘겨주었다.
장바구니 아이템 수량 조절 컴포넌트
//CartListItems.tsx const CartListItems = ({ item }: CartListItemProps) => { const handleIncrease = () => { if (item.quantity >= 5) { toast({ title: "최대 5개 까지 구매 가능합니다.", }); return; } const newCartItems = cartItems.map((cartItem) => { if (cartItem.id === item.id) { return { ...cartItem, quantity: Math.min(cartItem.quantity + 1, 5), }; } return cartItem; }); localStorage.setItem("shopping_cart", JSON.stringify(newCartItems)); setCartItems(newCartItems); }; const handleDecrease = () => { const newCartItems = cartItems.map((cartItem) => { if (cartItem.id === item.id) { return { ...cartItem, quantity: Math.max(cartItem.quantity - 1, 1), }; } return cartItem; }); localStorage.setItem("shopping_cart", JSON.stringify(newCartItems)); setCartItems(newCartItems); }; return ( {/* 중략 */} <QuantitySelector className="text-sm text-gray-400 mr-3" quantity={item.quantity} increase={handleIncrease} decrease={handleDecrease} /> ); }; export default CartListItems;
장바구니에 있는 수량은 바로 상태 업데이트하는 함수를 추가했다.
수량 증가, 감소 함수
const handleIncrease = () => { if (item.quantity >= 5) { toast({ title: "최대 5개 까지 구매 가능합니다.", }); return; } const newCartItems = cartItems.map((cartItem) => { if (cartItem.id === item.id) { return { ...cartItem, quantity: Math.min(cartItem.quantity + 1, 5), }; } return cartItem; }); localStorage.setItem("shopping_cart", JSON.stringify(newCartItems)); setCartItems(newCartItems); }; const handleDecrease = () => { const newCartItems = cartItems.map((cartItem) => { if (cartItem.id === item.id) { return { ...cartItem, quantity: Math.max(cartItem.quantity - 1, 1), }; } return cartItem; }); localStorage.setItem("shopping_cart", JSON.stringify(newCartItems)); setCartItems(newCartItems); };
cartItem에 있는 id를 찾아서 현재 id와 같은 값을 찾고, cartItem에 있는 quantity의 수량을 변경해준다.
그리고 로컬스토지와 useState로 동기화를 시켜준다.
결과
'✨ 기억보다 기록을 > 프로젝트' 카테고리의 다른 글
20241202(월) ▶️ 장바구니 페이지 결제하기 구현하기(토스페이먼츠), 약관동의 모달창 띄우기 (0) 2024.12.02 20241128(목) ▶️ 장바구니 페이지 checkbox 클릭시 리스트 전체선택하기, 전체삭제&선택삭제 구현하기 (0) 2024.11.28 20241127(수) ▶️ 장바구니 페이지 데이터 불러오기 (0) 2024.11.27 20241126(화) ▶️ 굿즈샵 상세보기 페이지 - 장바구니 버튼 클릭시 로컬스토리지에 저장하기 (0) 2024.11.26 20241125(월) ▶️ 굿즈샵 상세보기 페이지 - 리뷰탭 페이지네이션(TanStack Query) (0) 2024.11.25 댓글