1차 프로젝트를 하며 상당히 애먹었던 동적 라우팅...! 이번 기회에 제대로 정리해보려 한다!
react-router-dom
과 같은 부가적인 라이브러리를 설치하여 라우팅 기능을 추가한다.react-router-dom
을 사용한 라우팅에 필요한 기본적인 코드 구조는 아래와 같다.// Routes.js
const Routes = () => {
return (
<Router>
<Nav />
<Switch>
<Route exact path="/" component={App} />
<Route exact path="/users" component={Users} />
<Route exact path="/products" component={Products} />
</Switch>
<Footer />
</Router>
);
};
<Router>
<Switch>
<Route exact path='/product/:id' component={productDetail} />
// this.props.match.params.id
</Switch>
</Router>
:
는 Path parameter가 올 것임을 의미한다.id
는 path parameter의 이름을 의미한다. 변수명과 같이 임의의 이름을 지정해줄 수 있다."/users/:id" => <Users /> // this.props.match.params.id
React Router 에서 제공하는 history, match, location 객체를 사용하여 위의 id 값을 가져올 수 있다.
브라우저의 window.history 와 유사
주소를 임의로 변경하거나 되돌아 갈 수 있도록 한다.
주소 변경시, SPA 특성을 지키기 위해 페이지 전체를 리로드 하지 않는다.
location 이 포함되어 있다.
브라우저의 window.location 와 유사
현재 페이지 정보를 지니고 있다.
url의 query 정보를 search라는 프로퍼티에 가지고 있다.
Route의 path에 정의한 것과 매칭된 정보를 가지고 있다.
params 에 설정한 파라미터를 담고 있다.
match
객체를 통해 가져올 수 있다. path parameter로 명시해둔 값은 match 객체에 담기기 때문이다.
// ProductDetail.js
// current url -> localhost:3000/product/1
class ProductDetail extends React.Component {
...
render() {
console.log(this.props.match.params.id) // 1
return (
...
);
}
}
따라서 componentDidMount
메서드에서 해당 id
값을 통해 서버에 요청을 보내는 것을 통해 원하는 정보를 받아올 수 있다.
componentDidMount() {
fetch(`${API}/${this.props.match.params.id}`)
.then(res => res.json())
.then(res => ...);