그날의 공부기록
Home
  • FrontEnd Archive (222)
    • ✨ 기억보다 기록을 (51)
      • 트러블슈팅 (9)
      • 프로젝트 (42)
    • 📚 이론정리 (132)
      • React & Next.js (71)
      • JS & TS (16)
      • CSS (28)
      • HTML (6)
      • 알고리즘 (11)
    • 🐶 etc (39)
      • Github (6)
      • 디자인 (1)
      • VSCode (3)
      • 2022기록 (29)
Home
  • FrontEnd Archive (222)
    • ✨ 기억보다 기록을 (51)
      • 트러블슈팅 (9)
      • 프로젝트 (42)
    • 📚 이론정리 (132)
      • React & Next.js (71)
      • JS & TS (16)
      • CSS (28)
      • HTML (6)
      • 알고리즘 (11)
    • 🐶 etc (39)
      • Github (6)
      • 디자인 (1)
      • VSCode (3)
      • 2022기록 (29)
블로그 내 검색

그날의 공부기록

seokachu's Front-End Archive 🙂

  • ✨ 기억보다 기록을/프로젝트

    20241129(금) ▶️ 장바구니 페이지 - 수량 업데이트 적용하기

    2024. 11. 29.

    by. 서카츄

    구현을 마치고 보니 장바구니에서도 수량을 선택해서 업데이트 해주는 로직을 빼먹어서 수량도 조절할 수 있도록 구현해 보았다.

    먼저 기존에 수량 컴포넌트 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

    댓글

    관련글

    • 20241202(월) ▶️ 장바구니 페이지 결제하기 구현하기(토스페이먼츠), 약관동의 모달창 띄우기 2024.12.02
    • 20241128(목) ▶️ 장바구니 페이지 checkbox 클릭시 리스트 전체선택하기, 전체삭제&선택삭제 구현하기 2024.11.28
    • 20241127(수) ▶️ 장바구니 페이지 데이터 불러오기 2024.11.27
    • 20241126(화) ▶️ 굿즈샵 상세보기 페이지 - 장바구니 버튼 클릭시 로컬스토리지에 저장하기 2024.11.26
맨 위로
전체 글 보기
  • Github
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

seokachu's 기록저장소

블로그 이미지
서카츄

티스토리툴바