리액트 라우터(React Router)는 컴포넌트들 안에서부터 라우터의 state에 접근하거나 화면이동(navigation)을 수행하게 해주는 여러 hooks를 가지고 있다.
리액트 라우터에서 화면이동을 할 때 항상 history, location, match 라는 객체에 필요한 정보들을 보내게 되어있으며, history객체는 이 중 하나이다.
history 객체는 location, createHref, push, replace, go, goBack, goForward, block, listen 라우터의 state를 가지고 있다. (화면이동하는 데 사용되는 함수들)
ex) goBack() 함수를 사용하면 이전 페이지로 이동한다. 새로고침이 되지 않는다.
import React from 'react';
import { useHistory } from 'react-router-dom';
const Home = () => {
let history = useHistory();
// useHistory hook을 history라는 변수에 담아준다
return (
<div onClick={() => history.push('/cart')}> button </div>
// push 안에 특정 url 경로를 넣는다
);
};
export default Home;
history.push()로 props를 넘겨주는 방법
pathname, search, state 등의 키와 값을 함께 전달할 수 있다.
const history = useHistory();
history.push({
pathname: '/cart',
state: { userInfo: userInfo },
});
export default Home;
이동한 페이지에서 props를 불러오는 방법은, useLocation을 사용한다
import {useLocation} from "react-router";
const location = useLocation();
const userInfo = location.state.userInfo;
useLocation hooks는 사용자가 현재 머물러있는 페이지에 대한 정보를 알려주는 hooks.
import React from 'react';
import { useLocation } from 'react-router-dom';
const Cart = () => {
const location = useLocation(); // location 변수에location 객체 저장
console.log(location);
return (
<></>
);
}
export default Cart;
useParams는 useLocation과 유사한 hooks이다. 왜냐하면 useLocation은 쿼리스트링 정보(search 객체)를 얻는데 유용하다고 하면, useParams는 path parameter의 정보를 얻을 수 있는 hooks이다.
useParams를 사용하기 위해서 동적 라우팅 설정을 해주어야 한다.
import React from 'react';
import { BrowserRouter, Switch, Route } from 'react-router-dom';
import Home from 'components/Home';
const Detail = () => {
return (
<BrowserRouter>
<Switch>
<Route exact path='/home/:id' component={Home} />
{/* id라는 동적 라우팅값을 걸어주었다. */}
</Switch>
</BrowserRouter>
);
};
export default Detail;
:(콜론)을 이용하여 위와 같이 설계해놓으면, /home/ 뒤에 숫자 혹은 문자열이 오든 라우팅이 정상 작동된다.
이제 Home 컴포넌트에서 path parameter ( 동적 라우팅 값 )을 읽어올 수 있다.
import React from 'react';
import { useParams } from 'react-router-dom';
const Home = () => {
const { id } = useParams();
// 동적 라우팅 값으로 걸어둔 이름으로 객체를 가져올 수 있다.
// 현재 주소의 값이 http://localhost:3000/home/3 일때
console.log(id); // "3"이 출력된다.
return (
<></>
);
};
export default Home;