react-shop

양성진·2023년 2월 24일
0

장바구니 만들기

쇼핑몰을 만드는데 장바구니 만들기를 도전하고 있다.

우선 상품 상세보기에 들어가면

장바구니에 추가할수 있는 버튼이 있다.

생각 해본 방식이

  1. 버튼을 클릭
  2. 클릭후 카트에 담겨야한다.
    • 이때 카트에는 상품 정보(이름,가격,상품이미지,수량)이 담겨야한다.
  3. 담긴 데이터는 카트 페이지에서 리스트로 뽑아낸다.
  4. 이떄 클릭한 상품의 정보만이 추가되야한다.

추가로 이 담긴 데이터가 새로고침시에 유지될수 있게 LocalStorage로 데이터를 담아놓을수 있게 해야겠다.

상세보기 페이지에서 작성한 코드

    const [cartItems, setCartItems] = useState<CartItemType[]>(
        JSON.parse(saved) === null ? [] : JSON.parse(saved)
        // localstorage가 null값일때는 빈배열을 리턴 아니면 있는 내용 그대로 
        // 설정을 해놓지 않는다면 카트가 읽지를 못함
    )

    const handleAddToCart = (clickedItem: CartItemType) => {
        setCartItems((prev) => {
            const isItemInCart = prev.find((item) => item.id === clickedItem.id)
            /// click한 아이템의 아이디가 카트 배열에 있는지 확인해야한다.
            /// 있다면 그 내용을 찾아낸다.
            // 아이템이 있다면, 제품 정보 및 수량이 리턴 아니면 그냥 있는 그대로
            if (isItemInCart) {
                return prev.map((item) =>
                    item.id === clickedItem.id ? { ...item, amount: item.amount + 1 } : item
                )
            }
            return [...prev, { ...clickedItem, amount: 1 }]
            // 아예 빈카트(undefined)상태일떄는 새로운 제품들은 append되는식
            // 수량은 1개만 추가
        })
    }

설명은 주석처리로 해놨습니다.

하면서 어려웠던점

  • 데이터를 카트페이지로 넘겨줘야할때
    - 해결 방법
    
    let cartStorage: any = localStorage.getItem('cartStorage')
    const list: CartItemType[] = JSON.parse(cartStorage)
    localStorage에 저장되 있는 것을 불러와서 다시 객체화시켜서
    끄집어내서 쓰는식으로 했습니다.
  • 데이터를 유지해야할때.
    - 상태 초기값을 아예 localStorage 값을 설정

다시 시도해보고 싶은게 있다면?

  • 이 부분을 zustand로 처음에 만들었는데 제품 정보는 잘 받아오는데
    클릭시 수량 카운팅이 안되서 포기했습니다.

    하지만 전역상태관리를 쓸때가 지금 하는 방식보다 좀더 효율적이라고 판단이 되서 다른 전역상태관리를 사용해서 리팩토링 해볼 예정입니다.

profile
프론트엔드 개발자를 꿈꾸는 돼지

0개의 댓글

관련 채용 정보