๐React Router๋ก ์น์ฌ์ดํธ ๋ง๋ค๊ธฐ
๐๋ฆฌ์กํธ ๋ผ์ฐํฐ
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ก ํ์ด์ง๋ฅผ ๋๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ํ์ด์ง ๋๋๋ ๋ฐฉ๋ฒ
Routes ์ปดํฌ๋ํธ ์์๋ค๊ฐ Route ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐ์นํด์ ๊ฐ ํ์ด์ง๋ฅผ ๋๋ ์ค ์ ์์ต๋๋ค.
์ด๋ Routes ์์์๋ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก Route๋ฅผ ๊ฒ์ฌํ๋๋ฐ์.
ํ์ฌ ๊ฒฝ๋ก์ path prop์ด ์ผ์นํ๋ Route ๋ฅผ ์ฐพ์ต๋๋ค.
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="posts" element={<PostListPage />} />
<Route path="posts/1" element={<PostPage />} />
</Routes>
<Link to="/posts">๋ธ๋ก๊ทธ</Link>
<Routes>
<Route path="/"><HomePage /></Route>
<Route path="posts" element={<PostLayout />} >
<Route index element={<PostListPage />} />
<Route path="1" element={<PostPage />} />
</Route>
</Routes>
์ด๋ ๋ถ๋ชจ Route ์ปดํฌ๋ํธ์ element ๋ฅผ ์ง์ ํ๊ณ ,
์๋์ฒ๋ผ Outlet ์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ๋ฉด ๊ณตํต๋ ๋ ์ด์์์ ์ง์ ํด์ค ์ ์์์ฃ .
import { Outlet } from 'react-router-dom';
function PostLayout() {
return (
<div>
<h1>๋ธ๋ก๊ทธ</h1>
<hr />
<Outlet />
</div>
);
}
export default PostLayout;
<Routes>
<Route path="/"><HomePage /></Route>
<Route path="posts" element={<PostLayout />} >
<Route index element={<PostListPage />} />
<Route path=":postId" element={<PostPage />} />
</Route>
</Routes>
๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด useParams ๋ผ๋ ํ ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
function PostPage() {
const { postId } = useParams();
// ...
}
import { useSearchParams } from 'react-router-dom';
function PostListPage() {
const [searchParams, setSearchParams] = useSearchParams();
const filterQuery = searchParams.get('filter');
// ...
}
๋ง์ฝ ์ฟผ๋ฆฌ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ฃผ์๋ฅผ ์ด๋ํ๊ณ ์ถ๋ค๋ฉด Setter ํจ์์ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์ฟผ๋ฆฌ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
์๋ ์์๋ ?filter=react ๋ผ๋ ์ฟผ๋ฆฌ๋ก ์ด๋ํ๋ ์์์
๋๋ค.
setSearchParams({
filter: 'react',
});
๐ํ์ด์ง ์ด๋ํ๊ธฐ
function PostPage() {
// ...
const post = getPost(postId);
// post๊ฐ ์๋ ๊ฒฝ์ฐ /posts ํ์ด์ง๋ก ์ด๋
if (!post) {
return <Navigate to="/posts" />;
}
// ...
}
const navigate = useNavigate();
const handleClick = () => {
// ... ์ด๋ค ์์
์ ํ ๋ค์์ ํ์ด์ง๋ฅผ ์ด๋
navigate('/wishlist');
}
๐Link, Navigate, useNavigate๋ ์ธ์ ์ฐ๋๊ฒ ์ข์๊น?
์ธ ๊ฐ์ง ๋ชจ๋ ๋ค ํ์ด์ง๋ฅผ ์ด๋ํ ๋ ์ธ ์ ์๋ค๋ ์ ์์ ๋น์ทํ๋ฐ์.
์ด๊ฒ๋ค์ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์์ง ์์๋ ๊ฐ์ด ํ๋ฒ ์ดํด๋ด
์๋ค.
Link
์ฌ์ฉ์๊ฐ ํด๋ฆญํด์ ํ์ด์ง๋ฅผ ์ด๋ํ๋๋ก ํ ๋ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ํ์ดํผ๋งํฌ ํ
์คํธ๋ ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๋ฒํผ, ์ด๋ฏธ์ง ๋ฑ์ ์ฌ์ฉํ๋ฉด ๋๊ฒ ์ฃ ?
๋๋ถ๋ถ์ ๊ฒฝ์ฐ Link ๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค.
Navigate
ํน์ ๊ฒฝ๋ก์์ ๋ ๋๋ง ์์ ์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์์:
์ผํ๋ชฐ์ ํ์ ์ ์ฉ ํ์ด์ง์ ๋ก๊ทธ์ธ์์ด ๋ค์ด์์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ ๊ฒฝ์ฐ
์ผํ๋ชฐ์ ์ํ ์์ธ ํ์ด์ง์์ ์ ํ์ด ํ์ ๋์๊ฑฐ๋ ์ญ์ ๋์ด์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์ํค๋ ๊ฒฝ์ฐ
useNavigate
ํน์ ํ ์ฝ๋์ ์คํ์ด ๋๋๊ณ ๋์ ํ์ด์ง๋ฅผ ์ด๋์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์์:
์ผํ๋ชฐ์์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธฐ๋ฅผ ๋๋ ์ ๋ ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋ด๊ณ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ์ด๋์ํค๋ ๊ฒฝ์ฐ
์ผํ๋ชฐ์์ ๊ฒฐ์ ํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๊ณ ๋์ ๋ชจ๋ ๊ฒฐ์ ๊ฐ ์๋ฃ๋ ํ์ ํ์ด์ง๋ฅผ ์ด๋์ํค๋ ๊ฒฝ์ฐ
๋ฆฌ๋ค์ด๋ ํธ๋ ๋ก๊ทธ์ธ ํ์ด์ง์์ ๋ก๊ทธ์ธ์ ์๋ฃํ ํ์ ์ฒ์ ์ง์ ํ๋ ํ์ด์ง๋ก ๋์๊ฐ๋ ๊ฒฝ์ฐ