๐ ๋ผ์ฐํ ์ ๊ตฌํํ ์ ์๊ฒ ํด์ฃผ๋ ํจํค์ง
https://reactrouter.com/en/6.18.0
yarn add react-router-dom
npm install react-router-dom
// shared/router.js
import React from "react";
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Home from "../pages/Home";
import About from "../pages/About";
import Contact from "../pages/Contact";
import Works from "../pages/Works";
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
<Route path="/works" element={<Works />} />
</Routes>
</BrowserRouter>
);
};
export default Router;
route์๋ react-router-dom์์ ์ง์ํ๋ props๋ค์ด ์๋ค.
path์๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ํ๊ณ ์ถ์ ์ฃผ์๋ฅผ ๋ฃ๋๋ค.
element์๋ ํด๋น ์ฃผ์๋ก ์ด๋ํ์ ๋ ๋ณด์ฌ์ค ์ปดํฌ๋ํธ๋ฅผ ๋ฃ๋๋ค.
// App.jsx
import React from "react";
import Router from "./shared/Router";
function App() {
return <Router />;
}
export default App;
๊ฐ์ฅ ์ต์๋จ ์ปดํฌ๋ํธ์ธ App.jsx์ Router๋ฅผ ๋ฃ์ด์ค๋ค.
๐ path์ ์ ๋์ ์ธ ๊ฐ์ ๋ฃ์ด์ ํน์ ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๊ตฌํํ๋ ๊ฒ
์๋ฅผ ๋ค์ด works ํ์ด์ง์ ์ฌ๋ฌ๊ฐ์ work๊ฐ ์๊ณ work๋ง๋ค ๋ ๋ฆฝ์ ์ธ ํ์ด์ง๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
// shared/router.js
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
<Route path="/works" element={<Works />} />
{/* ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์. ๐ */}
<Route path="/works/:id" element={<Work />} />
</Routes>
</BrowserRouter>
);
};
export default Router;
works/:id
๋ผ๋ ๊ฒ์ด ๋์ ์ธ ๊ฐ (id) ์ ๋ฐ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
works/1
works/2
works/3
๋ชจ๋ <Work />
ํ์ด์ง๋ก ์ด๋ํ๋ค.
๊ทธ๋ฆฌ๊ณ :id
๋ useParams Hook์ ํตํด ์กฐํํ ์ ์๋ ๊ฐ์ด ๋๋ค. (ํ์ )
<Link>
๐
<Link>
๋ ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๊ฑฐ๋ ํญํ์ฌ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋ ์์์ด๋ค. HTML์์<a>
ํ๊ทธ์ ์ ์ฌํ๋ค.
JSX ์์ <a>
ํ๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๋ฐ๋์ <Link>
๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด์ผ ํ๋ค.
์๋ํ๋ฉด <a>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด์ง๋ฅผ ์ด๋ํ๋ฉด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก๊ณ ์นจ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก๊ณ ์นจ ๋๋ฉด ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง ๋์ด์ผ ํ๊ณ , ์ฐ๋ฆฌ๊ฐ redux๋ useState๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์์ ๊ตฌ์ถํด๋์ ๋ชจ๋ ์ํ๊ฐ์ด ์ด๊ธฐํ ๋๋ค. ์ด๋ ๋ถํ์ํ ์์ง์์ผ ๋ฟ๋ง ์๋๋ผ ์ฑ๋ฅ์ ์
์ํฅ์ ์ค ์ ์๋ค.
function Works() {
return (
<div>
<Link to={"/contact"}>contact๋ก ์ด๋</Link>
<h3>ํ ์ผ ๋ชฉ๋ก</h3>
{data.map((item) => (
<li key={item.id}>
<Link to={`/works/${item.id}`}>
{item.id} : {item.todo}
</Link>
</li>
))}
</div>
);
}
export default Works;
๐ useNavigate Hook์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก navigate ํ ์ ์๋ ํจ์๋ฅผ ๋ฐํํ๋ค.
๐ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
// src/pages/home.js
import { useNavigate } from "react-router-dom";
const Home = () => {
const navigate = useNavigate();
return (
<button
onClick={() => {
navigate("/works");
}}
>
works๋ก ์ด๋
</button>
);
};
export default Home;
๐ useLocation Hook์ ํ์ฌ ์์น ์ ๋ณด์ ๋ํ object๋ฅผ ๋ฐํํ๋ค. ์ด Hook์ ํ์ฌ ์์น๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค side effect๋ฅผ ๋ค๋ฃจ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
(ํ์ด์ง ์์์์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๋ฑ)
// src/pages/works.js
import { useLocation } from "react-router-dom";
function Works() {
const location = useLocation();
console.log(location); // ์ฝ์์ ์ฐ์ด๋ณด์
return (
<div></div>
);
}
export default Works;
๐ useParams hook์
<Route path>
์ ์ํด ์ผ์น๋ ํ์ฌ URL์์ ๋์ ํ๋ผ๋ฏธํฐ์ ํค/๊ฐ ์์ object๋ฅผ ๋ฐํํ๋ค.
๐ useParams๋ path์ ์๋ ๋์ ํ๋ผ๋ฏธํฐ (ex.:id
)์ ๊ฐ์ ์กฐํํ ์ ์๊ฒ ํด์ฃผ๋ Hook ์ด๋ค.
// src/pages/Work.js
import { useParams } from "react-router-dom";
import { data } from "../shared/data";
function Work() {
const params = useParams();
console.log(params); // ์ฝ์์ ์ฐ์ด๋ณด์
const { id } = useParams();
const work = data.find((item) => item.id === parseInt(id));
return (
<div>
{work.id} : {work.todo}
</div>
);
}
export default Work;