Front-End/React

[React] useParams로 상세 페이지 구현

시니철 2024. 10. 15. 19:04

React Router 페이지 나누기

Route 컴포넌트를 사용하여 리스트 페이지(Items)와 상세 페이지(Item)를 Route로 묶어 서로 다른 컴포넌트로 분리


페이지 라우팅 설정

import { Routes, Route } from "react-router-dom";
import Items from "./Items";
import Item from "./Item";

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />

      <Route path="/items">
        <Route index element={<Items />} />
        <Route path=":id" element={<Item />} />
      </Route>
    </Routes>
  );
}

export default App;

 

/items 경로는 Item 리스트 페이지를 기본으로 표시, :id 경로는 각각의 아이템 상세 페이지(Item)를 렌더링합니다.


API 호출 함수

아이템의 상세 정보를 가져오기 위해 API 호출 함수 작성

export async function getItem(id) {
  const response = await fetch(
    `https://hwiiron.com/items/${id}`
  );
  const data = await response.json();
  return data;
}

 

fetch 메서드를 사용하여 API로부터 아이템 데이터를 비동기적으로 가져오고, JSON 형태로 파싱하여 반환합니다.


상세 페이지 컴포넌트 구현

상세 페이지에서는 아이템 ID를 이용하여 해당 아이템의 정보를 가져옵니다.

const [item, setItem] = useState(null); // 아이템 상태 관리

const { id } = useParams(); // URL에서 아이템 ID 추출

useEffect(() => {
const fetchData = async () => {
  const data = await getItem(id); // API 호출
  setItem(data); // 아이템 정보 상태 업데이트
};
fetchData(); // 데이터 가져오기 호출
}, [id]); // ID 변경 시 다시 호출

if (!item) return null; // 아이템 데이터가 없으면 아무것도 렌더링하지 않음
  • 상태 관리: useState를 사용하여 아이템의 정보를 상태로 저장
  • URL 파라미터 사용: useParams를 통해 URL에서 아이템 id를 추출
  • 비동기 데이터 가져오기: useEffect를 통해 컴포넌트가 마운트될 때 API를 호출하여 아이템 데이터를 가져옴

요약

  • React Router를 사용하여 페이지를 라우팅하고, 아이템 리스트 페이지와 상세 페이지를 구성
  • API 호출 함수를 작성하여 서버로부터 아이템 정보를 비동기적으로 가져옴
  • 상세 페이지 컴포넌트는 URL에서 아이템 id를 읽어 해당 아이템의 상세 정보를 렌더링