❓ 상품 판매 리스트 페이지 → 판매 상세 페이지로 이동했을 때 이전 리스트 페이지에서 어떤 상품을 클릭했는지 어떻게 알고 API를 호출하는 걸까?
// Routes.js
import React from "react";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import Home from "./Pages/Home";
import List from "./Pages/List";
import Detail from "./Pages/Detail";
class Routes extends React.Component {
render() {
return (
<Router>
<Switch>
<Route exact path="/" component={Home} />
<Route exact path="/list" component={List} />
<Route exact path="/detail" component={Detail} />
</Switch>
</Router>
);
}
}
export default Routes;
- 예제 코드는 각각 리스트 페이지와 디테일 컴포넌트로 이동하도록 되어 있지만, 어떤 상품에 대한 상세 페이지를 나타낼지 알 수 있는 방법이 없다.
- 이런 상황에서는 유동 라우터를 통해 디테일 페이지를 연결할 수 있다.
동적 라우팅
동적 라우팅이란?
- 라우트의 경로에 특정 값을 넣어 해당 페이지로 이동할 수 있게 하는 것. (=Dynamic Routing)
- React Router에서는 두 가지 방법을 통해 유동 라우팅 기능을 이용할 수 있다.
Quey parameter
URL parameter
라우트로 설정한 컴포넌트의 3가지 props
- 라우트로 설정한 커모넌트는 3가지의 props를 전달받게 된다.
- history
- 이 객체를 통해 push, replace를 통해 다른 경로로 이동하거나 앞, 뒤 페이지로 전환할 수 있다.
- location
- 현재 경로에 대한 정보, URL 쿼리(/company_list?category=3)에 대한 정보를 가진다.
- match
- 어떤 라우트에 매칭이 되었는지에 대한 정보가 있고 params(/company_detail/:id)에 대한 정보가 있다.
처음 리스트 페이지로 접근했을 때, 특정 카테고리에 해당하는 데이터를 화면에 보여주고 싶다면? Query Parameter를 사용한다.
Query parameter
Query parameter을 이용해 리스트 페이지 이동
- 백엔드에 호출 값을 보낼 때 디테일 데이터를 받고 싶으면 주소 뒤에 id 값을 보내줘 라고 요청했을 때
- url의 주소가
/company_list?category=3
인 경우
const id = this.props.location.search.split("=")[1];
fetch(`${localhost}/job/list/${id}`, {
// 생략
})
- this.props.location을 통해 해당 주소의 정보를 가지고 올 수 있다.
- id에는 3이라는 값이 담긴다.
Query parameters가 길어지는 경우
- Query parameters는 & 연산자를 이용하여 얼마든지 길어질 수 있다.
- 11번가의 상세 페이지를 예시로 들어 보자.
http://www.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1259146705&trTypeCd=PW00&trCtgrNo=1001841
- 원하는 name의 value를 가져오기 위해서는 그에 맞는 함수를 작성하면 된다
- name 값을 매개변수로 받고 switch문을 사용해 value를 return하는 함수를 작성하거나…
리스트 페이지 → 상세 페이지 이동할 때
- 리스트 페이지 안 CompanyItem 컴포넌트가 있고 map 함수를 통해 렌더링 중인 예시
<CompanyItem
...생략
jobId={e.job.id}
/>
- CompanyItem 클릭 시 Link 전체가 Link 태그로 감싸져 있다고 할 때
<Link to={`/company_detail/${this.props.id}`}>
</Link>
- 바로 여기서 URL Parameter를 사용할 수 있다.
URL Parameter
- URL Parameter는 match라는 객체가 있다.
- match : 어떤 라우트에 매칭되었는지에 대한 정보가 있고 params(/company_detail/:id) 정보를 가지고 있다.
- params 정보는 this.props.match.params를 통해 가지고 올 수 있다.
- hook을 사용할 경우
useParams()
를 사용해도 된다.
- hook을 사용할 경우
- params 데이터를 사용하기 위해서는 반드시 Route에서 값을 지정해주어야 한다.
// Routes.js로 돌아와서
<Router>
<Switch>
<Route exact path="/company_detail/:id" component={ComponentDetailPage}>
</Switch>
- :는 Path Parameter가 올 자리를 의미한다.
- id는 Path Parameter의 변수명이다.
// ComponentDetailPage.js
fetch(`${localhost}/job/detail/${this.props.match.params.id}`, {
// 생략
})
this.props.match.params.id
이렇게 id 값을 가져올 수 있다.
두 가지 방법은 각각 어떤 상황에서 사용하는 게 좋을까요?
String parameters
- 해당 페이지에서 여러 정보가 필요한 경우
- Query Paramert를 사용하고 싶은 경우 routes.js를 수정해야 하기 때문에 유지보수 측면에서 좋지 않다고 판단될 경우
- 필터링을 하고 싶을 경우
Query parameter
- 특정한 resource를 식별하고 싶을 경우, 딱! 하나만 필요할 경우.
요약
- SPA를 구축하기 위해 라우팅 기능이 필요하다면, React Router 라이브러리를 사용해 기능을 구현할 수 있다.
- 유동 라우터랑 라우트 경로에 특정 값을 넣어 해당 페이지로 이동할 수 있게 하는 것인데, React Router에서는 두 가지 방법을 통해 유동 라우팅 기능을 이용할 수 있다.
- 1) Query String, 2) URL Parameter
문서 정리 출처
https://velog.io/@joonsikyang/React-Project-URL-parameters-Query-parameters