ㆍProject Diary/React + Firebase (Snack ShoppingMall)
상품의 상세페이지를 구현하는 방법 기록
상품 상세페이지는 사용자가 특정 상품을 클릭했을 때 해당 상품에 대한 자세한 정보를 보여주는 페이지입니다.
1. React Router 설정
Route 컴포넌트는 React Router 라이브러리에서 제공하는 컴포넌트로, URL 경로와 해당 경로가 매칭될 때 렌더링할 컴포넌트를 지정합니다.
2. ProductDetailView 경로 설정
ProductDetailView 컴포넌트를 특정 상품의 상세 페이지로 연결하는 설정
<Route path="/product/:id" element={<ProductDetailView />} />
2-1 Route 컴포넌트
Route 컴포넌트는 경로(path)와 해당 경로에 매칭될 때 렌더링할 컴포넌트(element)를 정의합니다.
2-2 path 속성
path 속성은 URL 경로를 정의합니다.
여기서 "/product/:id"는 동적 세그먼트를 포함한 경로입니다. 동적 세그먼트는 콜론(:)으로 시작하며, 실제 경로의 일부로 치환됩니다.
/product/:id
- :id 부분은 동적 세그먼트로, 여러 값으로 대체될 수 있습니다
- 예를 들어, "/product/1", "/product/2" 등과 같이 다양한 상품 ID에 해당하는 경로로 치환됩니다
2-3 element 속성
element 속성은 해당 경로가 매칭될 때 렌더링할 컴포넌트를 정의합니다. 여기서는 ProductDetailView 컴포넌트를 지정했습니다.
3. ProductDetailView 컴포넌트에서 동적 세그먼트 사용
이제 ProductDetailView 컴포넌트에서 동적 세그먼트로 전달된 id를 사용하는 방법을 살펴보겠습니다.
3-1 useParams 훅 사용
React Router는 useParams 훅을 제공하여 URL 파라미터를 쉽게 접근할 수 있도록 도와줍니다.
import { useParams } from "react-router-dom";
const ProductDetailView = () => {
const { id } = useParams();
// id를 이용하여 해당 상품의 상세 정보를 가져옵니다.
};
useParams 훅을 사용하면 URL 경로에 포함된 동적 세그먼트 값을 쉽게 가져올 수 있습니다.
여기서는 id를 가져와서 해당 상품의 상세 정보를 조회하는 데 사용합니다.
4. ProductDetailView 컴포넌트 구현
이제 ProductDetailView 컴포넌트 전체 코드를 동적 세그먼트를 포함하여 구현해보겠습니다.
import React, { useEffect } from "react";
import styled from "styled-components";
import { useParams } from "react-router-dom";
import { useDispatch, useSelector } from "react-redux";
import { fetchProducts } from "@/store/product";
const ProductDetailSectionBlock = styled.div`
//스타일 생략
`;
const ProductDetailView = () => {
const { id } = useParams();
const dispatch = useDispatch();
const products = useSelector((state) => state.products.products);
const product = products.find((product) => product.id.toString() === id);
useEffect(() => {
if (!products.length) {
dispatch(fetchProducts());
}
}, [dispatch, products.length]);
if (!product) return <p>Loading...</p>;
return (
<ProductDetailSectionBlock className="row">
<h2 style={{ color: "#333", marginBottom: "20px", fontSize: "30px" }}>
{product.name}
</h2>
<div className="content">
<div className="info">
<p>가격 : {product.price.toLocaleString()}¥</p>
<p>
<span dangerouslySetInnerHTML={{ __html: product.description }} />
</p>
</div>
</div>
</ProductDetailSectionBlock>
);
};
export default ProductDetailView;
요약
- Route 설정: path에 동적 세그먼트를 사용하여 다양한 경로를 하나의 컴포넌트에 매핑할 수 있습니다.
- useParams 훅 사용: 동적 세그먼트를 useParams 훅으로 가져와 컴포넌트에서 사용할 수 있습니다.
- ProductDetailView 컴포넌트: URL에서 가져온 id를 사용하여 해당 상품의 상세 정보를 보여줍니다.
이렇게 하면 사용자가 상품 목록에서 특정 상품을 클릭했을 때 해당 상품의 상세 정보를 보여주는 페이지를 쉽게 구현할 수 있습니다.