React/쇼핑몰 프로젝트

[React] 쇼핑몰 프로젝트 (4) - Router, 상세페이지

위르겐 2022. 5. 30. 15:28

 

다음과 같이 선수들의 사진을 클릭했을 때

Route를 이용해 각 선수들의 상세페이지로 이동하게 하고 싶다.

 

<Route path="/detail/:id" element={<DetailPage player={player}/>}/>
 

확장성을 위해

URL뒤에 /:id를 입력하면

/detail/'아무거나' 어떻게 입력하든 그 페이지를 보여준다.

정확히는

오류를 띄우지 않는다.

 

 

detail.js파일을 생성 후

DetailPage 컴포넌트를 만들어보자

 

import { useParams } from "react-router-dom";

const DetailPage = (props) => {

  let {id} = useParams();


  return(
<div className="container">
  <div className="row">
    <div className="col-md-6">
      <img src={process.env.PUBLIC_URL + `/${id}.png`} width="100%" />
    </div>
    <div className="col-md-6">
      <h4 className="pt-5">{props.player[id].name}</h4>
      <p>{props.player[id].age}</p>
      <p>{props.player[id].position}</p>
      <button className="btn btn-danger">주문하기</button> 
    </div>
  </div>
</div> 
)
}
export default DetailPage;
 

리액트 라우터 돔으로부터

useParams를 import해오고

 

DetailPage라는 컴포넌트 안에

useParams를 id 변수로 저장해준다.

 

이렇게 했을때

 

URL/:id

주소에서 :id 부분에 들어가는 숫자값을

컴포넌트에서도 사용할 수 있다는것!

 

http://localhost:3000/detail/0

로 입력하면

컴포넌트에서 id에 들어가는 값을 전부 0으로 대입할수 있다는 것이다!

 

그래서 상세페이지로 접속했을 때

데이터에서 가져온

props.player[0].name

props.player[0].age

props.player[0].position

등이 표시되는 것이다!

 

 

const List = (props) => {
  return (
  <div className="col-md-4">
  <Nav.Link href={'detail/'+props.i} style={{display:'inline-block'}}>
  <img src={process.env.PUBLIC_URL + '/' + props.i + '.png'} width="70%" height="200px"/>
  </Nav.Link>
  <h4>{props.player.name}</h4>
  <p>{props.player.age}</p>
  <p>{props.player.position}</p>
</div>
  )
}
 

기존 메인페이지의

리스트를 나타내는 컴포넌트를 살펴보자

 

img태그를

Nav.Link태그로 감싸서 클릭했을 시

'detail/props.i' 주소로 이동하게 만들면

 

 

 

완성!

 

 

 

 

리액트 문법이 어렵다는 말을 많이 들었다.

 

아직 진짜 어려운건 시작도 안했음에도 불구하고

배운 내용을 까먹게 된다.

 

블로그를 시작하기 잘했다는 생각이 드는 가장 큰 이유는

바로 복습이다.

 

포스팅하기 위해서라도 이해될 때 까지 복습하고

내것으로 만들어 숙지해야 한다.

 

반응형