이번 업데이트로 정말 많이 똑똑해지고 편리해진 React Router v6!
React Router v6 업데이트가 이전과 달라진 부분들이 많아 정리해 보려 한다. 아래의 정리는 모두 2021.11.18 의 React Router 공식 문서를 참고해 정리한 내용이다.
언제나 정확하고 최신의 자료는 공식 문서에서 참고하기!
[React Router 공식문서]
React Router 설치
npm i react-router
이전에는 아주 정확하게 경로를 path 작성하지 않거나 모호한 경우 문제가 생겼다. 하지만 이번 업데이트로 가장 알맞는 부분으로 알아서 찾아간다. exact 도 그래서 사라졌다.
<Route path="posts/:postId" element={<Team />} />
<Route path="posts/new" element={<NewTeamForm />} />
위 예시 코드에서 보면 posts/new
는 위 2개의 route에 모두 일치한다. 하지만 posts/new
가 더 구체적이기 때문에 이 <NewTeamForm />
가 보일 것이다.
Link
는 이전처럼 태그에 바로 route 주소를 설정해 옮길 때 사용하면 된다.
import { Link } from "react-router-dom";
function App() {
return (
<div>
<h1>Home</h1>
<nav>
<Link to="/">Home</Link>
<Link to="contact">Contact</Link>
</nav>
</div>
);
}
이전 버전에서는 useHistory 가 있었는데 이제는 useNavigate를 써야 한다.
import { useNavigate } from "react-router-dom";
function Invoices({checkValidation}) {
let navigate = useNavigate();
const checkLogin = () => {
if(checkValidation){
navigate(`/main`)
}
}
return (
...
<div>
<LoginBtn onClick={checkLogin}/>
</div>
);
}
import { Routes, Route, useParams } from "react-router-dom";
function App() {
return (
<Routes>
<Route
path="posts/:postId"
element={<Post />}
/>
</Routes>
);
}
function Post() {
let params = useParams();
return <h1>Post {params.postId}</h1>;
}
:style
syntax 를 route path 에 사용하면 useParams() 로 이를 불러와 사용할 수 있다.
:
뒤에 나오는 부분이 params 의 key 부분이 되어 :postId
는postId
가 key가 되어 불러오고 있음을 확인하자.
이렇게 가져온 id로 fetch data를 하는데 가장 많이 사용한다.
function Invoice() {
let { postId } = useParams();
let post = useFakeFetch(`/api/invoices/${postId}`);
return post ? (
<div>
<h1>{post.postTitle}</h1>
</div>
) : (
<Loading />
);
}
react router 에서 가장 강력한 기능 중 하나라고 말하는 nested routes (복잡한 layout code 안에서 고민하지 않게 해주는 아주 고마운 기능)
function App() {
return (
<Routes>
<Route path="posts" element={<Posts />}>
<Route path=":postId" element={<Post />} />
<Route path="notice" element={<Notice />} />
</Route>
</Routes>
);
}
/posts
, /posts/:postId
, /posts/notice
3가지의 path 가 있다.posts
으로 감싸진 notice
route 는 결과적으로 /posts/notice
가 되는 것이다.<Notice />
만 보여지는 것이 아니라 아래처럼 그려진다.<App>
<Posts>
<Notice />
</Posts>
</App>
<Outlet>
를 넣어야 하는데, 이 <Outlet>
에 매칭되는 자식 route 가 그려지기 때문이다.import { Routes, Route, Outlet } from "react-router-dom";
function Posts() {
return (
<div>
<h1>Posts</h1>
<Outlet />
</div>
);
}
function App() {
return (
<Routes>
<Route index element={<Home />} />
<Route path="about" element={<About />}>
<Route index element={<AboutHome />} />
<Route
path="location"
element={<AboutLocation />}
/>
</Route>
</Routes>
);
}
<Link to= 'path'>
의 path 에 들어가는 값은 그 route 를 렌더링 한 route에 영향을 받습니다.import {
Routes,
Route,
Link,
Outlet
} from "react-router-dom";
function Home() {
return <h1>Home</h1>;
}
function About() {
return (
<div>
<h1>About</h1>
<nav>
<Link to="/location">Location</Link>{" "}
<Link to="contact">Contact</Link>
</nav>
<hr />
<Outlet />
</div>
);
}
function Location() {
return <h1>Location</h1>;
}
function Contact() {
return <h1>Contact</h1>;
}
function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="about" element={<About />}>
<Route path="location" element={<Location />} />
<Route path="contact" element={<Contact />} />
</Route>
</Routes>
);
}
<About/>
안에서 랜더링 되었기 때문에 /about/location/
, /about/contact/
로 링크 될 것입니다.path="*"
를 사용해서 "not found" 라우트를 렌더링 할 수 있다. function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="About" element={<About />} />
<Route path="*" element={<NotFound />} />
</Routes>
);
}
<Router>
만 사용해야 하지만 <Routes>
는 많이 사용해도 된다.<Routes>
는 독립적으로 작동됩니다. 그리고 자신의 자식 route 를 렌더링 합니다.function App() {
return (
<div>
<Nav>
<Routes>
<Route path="/" element={<MainNav />} />
<Route
path="news"
element={<News />}
/>
</Routes>
</Sidebar>
<MainContent>
<Routes>
<Route path="/" element={<Home />}>
<Route path="about" element={<About />} />
<Route path="contact" element={<Contact />} />
</Route>
<Route path="menu" element={<Menu />}>
<Route path="icecream" element={<Icecream />} />
<Route path=" tea" element={<Tea />} />
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
</MainContent>
</div>
);
}
<Routes>
는 어디에서나 렌더링 할 수 있음 function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="dashboard/*" element={<About />} />
</Routes>
);
}
function Dashboard() {
return (
<div>
<p>Look, more routes!</p>
<Routes>
<Route path="/" element={<DashboardGraphs />} />
<Route path="location" element={<Location />} />
</Routes>
</div>
);
}
좋은 글 감사합니다!