인프런 커뮤니티 질문&답변

ju han님의 프로필 이미지

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

비회원 장바구니 구현 리뷰

baskets.push할때

해결된 질문

23.03.24 21:13 작성

·

371

0

 안녕하세요. 강의를 진행하는데 서버가 죽은것같아 직접 배열을 만들어서 예제를 진행중입니다.

그런데 자꾸 문제가 생기네요,,

첫번째 클릭에서는 객체가 localStorage에 저장이 되는데 그 이후부터 진행이 안됩니다. 이유가 무엇일까요,,

이모션 부분은 제외하고 전달드립니다ㅜ

import styled from "@emotion/styled";
import { Modal } from "antd";

interface IBasketsProps {
  id: number;
  writer: string;
  product: string;
  price: number;
}

const myBasket = [
  { id: 100, writer: "짱구", product: "액션가면 인형", price: 30000 },
  { id: 200, writer: "철수", product: "과외", price: 40000 },
  { id: 300, writer: "훈이", product: "도시락", price: 50000 },
  { id: 400, writer: "맹구", product: "시냇물 돌", price: 2000000 },
];

export default function BasketHomework() {
  const onClickBtn = (basket: IBasketsProps) => () => {
    const baskets: IBasketsProps[] = JSON.parse(
      localStorage.getItem("baskets") ?? "[]"
    );
    console.log(baskets);

    const alreadyIn = baskets.filter((el) => el.id === basket.id);
    if (alreadyIn.length === 1) {
      Modal.warning({ content: "이미 찜한 상품입니다." });
      return;
    }

    baskets.push(basket);
    localStorage.setItem("baskets", JSON.stringify(basket));
  };
  return (
    <>
      <CardWrapper>
        {myBasket.map((el, index) => (
          <Card key={index}>
            <Product>{el.product}</Product>
            <Writer>{el.writer}</Writer>
            <Price>{el.price}</Price>
            <button onClick={onClickBtn(el)}>장바구니 담기</button>
          </Card>
        ))}
      </CardWrapper>
    </>
  );
}

 

답변 2

0

안녕하세요!

localStorage.getItem("baskets") ?? "[]" 이부분을 localStorage.getItem("baskets") || "[]" 이렇게 바꿔보시겠어요?
위의 ?? 연산자는 널리쉬코알레싱으로 ||와는 다른 기능을 하는 연산자 입니다.
즉 비어있는 값일때 한번 실행을 하게 되는데, 따라서 처음에 한번 실행이 되고 이후에는 장바구니에 뭔가 담겨있기 때문에 실행이 안되는 것으로 보입니다.

감사합니다.😁

0

Camp_멘토님의 프로필 이미지

2023. 03. 27. 15:52

안녕하세요 juhan님
장바구니에 이미 있는경우에 대한 처리를 말씀하시는것 같은데
현재의 filter 외 지금 누른 item의 id가 배열에 include되어있는지를 검증하는 것이 좋을것같습니다

ju han님의 프로필 이미지

작성한 질문수

질문하기