์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ์ด๋ถํ์
- ์นด์นด์ค
- ์ฝ๋ ํฌ๋ฉง
- ์ฝ๋ฉํ ์คํธ
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋์ ๊ณํ๋ฒ
- ์ฝํ
- ์นด์นด์ค์ฑ์ฉ
- svgํ์ผ ๋ค๋ฃจ๊ธฐ
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- DP
- TypeScript
- ๋ธ๋ฃจํธํฌ์ค
- ๊ณผ์ ํ ์คํธ
- router v6
- JavaScript
- React
- js
- ๋ฐฑ์ค
- ์๊ณ ๋ฆฌ์ฆ
- custom hook
- ๋ถ์คํธ์บ ํ์น๋ชจ๋ฐ์ผ
- ์ด๋ฏธ์ง ์์
- ๋ถ์คํธ์ปจํผ๋ฐ์ค
- ๋ฆฌ๋์ค ํดํท
- Node.js
- ๋๋๊ทธ ์ด๋ฒคํธ
- Redux toolkit
- ์๋ฐ์คํฌ๋ฆฝํธ
- icecandidate
- Today
- Total
๐ฅ dev-ruby
[React] ๋ฆฌ์กํธ ๋ผ์ฐํฐ(Router) ์ค์ ํ๊ธฐ ๋ณธ๋ฌธ
์ต๊ทผ ๋ฆฌ์กํธ ๋ผ์ฐํฐ๊ฐ v5 ์์ v6๋ก ์ ๋ฐ์ดํธ ๋๋ฉด์ ๋ฐ๋ ๊ฒ๋ค์ ์ ๋ฆฌํด๋ณผ๊น ํ๋ค.
๋ผ์ฐํฐ ์์ํ๊ธฐ
์ค์น
: ๋จผ์ ์ค์น๋ฅผ ํด์ค๋ค. ๋ค์ 6์ ๋ฒ์ ์ ๋ํ๋ธ๋ค.
npm install react-router-dom@6
URL ์ฐ๊ฒฐ
๋จผ์ ์ฑ์ ๋ธ๋ผ์ฐ์ ์ URL์ ์ฐ๊ฒฐํ๋ค. BrowserRouter์ ์ ์ฒด ์ฑ์ ๋ ๋๋งํ๋ค.
index.js
import { render } from "react-dom";
import { BrowserRouter } from "react-router-dom";
import App from "./App";
const rootElement = document.getElementById("root");
render(
<BrowserRouter>
<App />
</BrowserRouter>,
rootElement
);
Routes
: ์๋ก ๋ค๋ฅธ URL์์ ์ฑ์ ๋ ๋๋ง ํ ์ ์๊ฒ ํด์ค๋ค.
: v6๊ฐ ๋ฆด๋ฆฌ์ฆ๋๋ฉด์ Switch๊ฐ Routes๋ก ๋ฐ๋์๋ค.
index.js
import { render } from "react-dom";
import {
BrowserRouter,
Routes,
Route
} from "react-router-dom";
import App from "./App";
import Home from "./routes/home";
import About from "./routes/about";
const rootElement = document.getElementById("root");
render(
<BrowserRouter>
<Routes>
<Route path="/" element={<App />} />
<Route path="home" element={<Home />} />
<Route path="about" element={<About />} />
</Routes>
</BrowserRouter>,
rootElement
);
<Routes>์์ ๋ซ์ ๋ผ์ฐํฐ๋ฅผ ๋์ดํด์ค๋ค.
์ด์ "/home"์ผ๋ก ์ ๊ทผํ๋ฉด ๋ฅผ ์ ์ธํ ๊ณณ์ Home์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๊ฒ์ด๋ค.
component๊ฐ ์ฌ๋ผ์ง๊ณ , ๋์ ์ element ์ฌ์ฉํ๋ค.
<Route path="/" element={<Home />} />
<Route path="/login" element={<Login />} />
Route์ exact๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋์ด์์
๊ธฐ์กด ์ฝ๋
<Route path="/login" exact component={UsersPage} />
v6 ์ฝ๋
<Route path="/login" element={<UsersPage />} />
useNavigate
: useHistory ๊ธฐ๋ฅ์ ์ ๋ถ ๋์ฒดํ๋ค.
import { useNavigate } from "react-router-dom";
const navigate = useNavigate();
navigate('/'); // "/"๊ฒฝ๋ก๋ก ์ด๋
navigate(-1);
navigate(-2);
navigate(`/user/${user._id}`);
Link
: ํด๋น ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด to์ ํ ๋น๋ ์ฃผ์๋ก ์ด๋ํ๋ค.
์ด๋ํ๋ฉด to ๋งํฌ๋ก Route์์ ์ค์ ํ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ค.
import { Link } from "react-router-dom";
function Home() {
return (
<div>
<h1>Home</h1>
<nav>
<Link to="/">Home</Link> |{" "}
<Link to="about">About</Link>
</nav>
</div>
);
}
์๋ธ๋ผ์ฐํธ 1
: path์ *์ฌ์ฉ
<Route path="/users/*" element={<Users />} />
์๋ธ ๋ผ์ฐํธ 2
: Outlet ์ฌ์ฉ
App.js
<Route path="/users/*" element={<Users />} >
<Route path="" element={<Main />} />
<Route path="about" element={<About />} />
</Route>
Users.jsx
<Outlet />
Nested Routes
: ์ค์ฒฉ๋ผ์ฐํฐ
<Routes>
<Route path="/" element={<App />}>
<Route path="expenses" element={<Expenses />} />
<Route path="invoices" element={<Invoices />} />
</Route>
</Routes>
"/expenses"์ "/invoices" ๋ก / ๋ค์ ์ค์ฒฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ ์ "๋ถ๋ชจ" ๊ฒฝ๋ก์ Outlet๊ฐ ํ์ํ๋ค.
๋ถ๋ชจ๊ฒฝ๋ก๋ "/"๊ฐ ๋ ๊ฑฐ๊ณ , /์์ invoices๋ expenses๋ฅผ ํด๋ฆญํ๋ฉด Outlet์ ์ค์ฒฉ์ผ๋ก ๋ ๋๋ง์ด ๋ ๊ฒ์ด๋ค.
<div>
<Link to="/invoices">Invoices</Link> |{" "}
<Link to="/expenses">Expenses</Link>
<Outlet />
</div>
์๋๊ฒฝ๋ก ์ฐ๊ธฐ
: Linkํ๊ทธ์ to ๊ฒฝ๋ก ์์ / ๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ๋๋ค.
<Link to="" /> // ์ด๋ ๊ฒ ์
๋ ฅํ๋ฉด ํ์ฌ ํ์ด์ง๋ก ์ด๋
<Link to="about" /> // ์ด๋ ๊ฒ ์
๋ ฅํ๋ฉด ํ์ฌ url์ /about์ ๋ถ์ธ ๊ณณ์ผ๋ก ์ด๋ -> ๋จ, about์์ /about์ ๋ถ์ด๊ฒ๋๋ฉด ์ง์ง /about์ผ๋ก ์ด๋๋๋ค.
<Route path="" />
<Route path="about" />
NavLink ์ ์คํ์ผ ์ ์ฉํ๊ธฐ
: isActive ๋ก ์ผํญ์ฐ์ฐ์ ์ ์ฉํ๊ธฐ
<NavLink to="/users" style={({ isActive }) => ({ color: isActive ? 'blue' : 'red' })} >
Users
</NavLink>
<NavLink to="/users" className={({ isActive }) => "nav-link" + (isActive ? "activated" : "") } >
Users
</NavLink>