그날의 공부기록
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 🙂

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

    20241122(금) ▶️ 굿즈샵 상세보기 페이지 - 버튼 클릭 시 해당 탭 메뉴 내용 보여주기

    2024. 11. 22.

    by. 서카츄

    상세보기 페이지에 있는 탭 메뉴를 구현해 보려고 한다.

    탭 메뉴는 `상세보기`와 `리뷰` 탭 이렇게 두개가 있는데, 해당 버튼을 클릭하면 해당 내용이 보이도록 조건부 랜더링을 작성해 보았다.

     

     

     

     

     

    //ProductDescription.tsx
    
    const ProductDescription = ({ id }: ShopMenuProps) => {
      const [activeTab, setActiveTab] = useState<"description" | "review">(
        "description"
      );
    
      return (
        <div className="py-28 w-full">
          <TabMenu id={id} activeTab={activeTab} setActiveTab={setActiveTab} />
          {activeTab === "description" ? (
            <DescriptionTab id={id} />
          ) : (
            <ReviewTab id={id} />
          )}
        </div>
      );
    };
    
    export default ProductDescription;

     

    상세보기 탭 메뉴를 보여주는 부모 컴포넌트이다.

    자식 컴포넌트에게 id를 props으로 넘겨주고, 탭 메뉴는 state 값을 넘겨준다.

     

     

     

     

     

     

    const [activeTab, setActiveTab] = useState<"description" | "review">(
      "description"
    );

     

    useState를 사용해서 `description` 과 `review` 를 넣고, 초기값은 상세보기 페이지를 보여줘야하니 description 을 넣어주었다.

    activeTab에서는 유니온 타입을 넣어줘서 명시적으로 2가지 타입만 들어올 수 있도록 만들었다.

     

     

     

     

     

     

    {activeTab === "description" ? (
        <DescriptionTab id={id} />
      ) : (
        <ReviewTab id={id} />
    )}

     

    그리고 조건에 따라 해당 페이지가 `description` 이면 상세보기 페이지를,

    아니면 리뷰 탭 페이지를 보여준다.

     

     

     

     

     

     

    //TabMenu.tsx
    
    const TabMenu = ({ activeTab, setActiveTab, id }: TabMenuProps) => {
      const { data } = useShop(id);
    
      return (
        <div className="mb-16">
          <ul className="flex justify-between items-center text-center cursor-pointer">
            <li
              onClick={() => setActiveTab("description")}
              className={`${
                activeTab === "description"
                  ? "border-b-2 border-dark-gray"
                  : "border-b"
              } w-2/4 py-4`}
            >
              <h3 className={`${activeTab === "description" ? "font-bold" : ""}`}>
                상세정보
              </h3>
            </li>
            <li
              onClick={() => setActiveTab("review")}
              className={`${
                activeTab === "review" ? "border-b-2 border-dark-gray" : "border-b"
              } w-2/4 py-4`}
            >
              <h3
                className={`${
                  activeTab === "review" ? "font-bold" : ""
                } flex gap-2 justify-center items-center`}
              >
                리뷰<span>{data?.review_count}</span>
              </h3>
            </li>
          </ul>
        </div>
      );
    };
    
    export default TabMenu;

     

    탭 메뉴 컴포넌트 코드는 이렇게 구성되어 있다.

     

     

     

     

     

     

     

      <li
        onClick={() => setActiveTab("description")}
        className={`${
          activeTab === "description"
            ? "border-b-2 border-dark-gray"
            : "border-b"
        } w-2/4 py-4`}
      >
        <h3 className={`${activeTab === "description" ? "font-bold" : ""}`}>
          상세정보
        </h3>
      </li>

     

    상세정보와 리뷰 탭 같은 경우 조건부로 `setActiveTab`이 `description`일때 스타일을 추가해준다.

     

     

     

     

     

     

     

     

    <li
        onClick={() => setActiveTab("review")}
        className={`${
          activeTab === "review" ? "border-b-2 border-dark-gray" : "border-b"
        } w-2/4 py-4`}
      >
        <h3
          className={`${
            activeTab === "review" ? "font-bold" : ""
          } flex gap-2 justify-center items-center`}
        >
          리뷰<span>{data?.review_count}</span>
        </h3>
      </li>

     

    리뷰 탭 같은 경우에도 같이 조건부 랜더링을 적용해준다.

     

     

     

     

     

     

    결과

    저작자표시 비영리 변경금지 (새창열림)

    '✨ 기억보다 기록을 > 프로젝트' 카테고리의 다른 글

    20241125(월) ▶️ 굿즈샵 상세보기 페이지 - 리뷰탭 페이지네이션(TanStack Query)  (0) 2024.11.25
    20241125(월) ▶️ 굿즈샵 상세보기 페이지 - 상세보기 탭 데이터 불러오기, 리뷰 탭 페이지 데이터 불러오기  (0) 2024.11.25
    20241121(목) ▶️ 굿즈샵 상세보기 페이지 - 가격 정보 데이터 불러오기  (0) 2024.11.21
    20241120(수) ▶️ 굿즈샵 select 클라이언트에서 sort 해결하기+메모이제이션  (0) 2024.11.20
    20241119(화) ▶️ 굿즈샵페이지 스켈레톤 구현하기, Select 정렬하기  (0) 2024.11.19

    댓글

    관련글

    • 20241125(월) ▶️ 굿즈샵 상세보기 페이지 - 리뷰탭 페이지네이션(TanStack Query) 2024.11.25
    • 20241125(월) ▶️ 굿즈샵 상세보기 페이지 - 상세보기 탭 데이터 불러오기, 리뷰 탭 페이지 데이터 불러오기 2024.11.25
    • 20241121(목) ▶️ 굿즈샵 상세보기 페이지 - 가격 정보 데이터 불러오기 2024.11.21
    • 20241120(수) ▶️ 굿즈샵 select 클라이언트에서 sort 해결하기+메모이제이션 2024.11.20
맨 위로
전체 글 보기
  • Github
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

seokachu's 기록저장소

블로그 이미지
서카츄

티스토리툴바