: ํ์ด์ง ์๋ก๊ณ ์นจ ํ ํ์ ์์ด, ํ์ด์ง์ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ ๋ ๋๋ง ํ๋๋ก ๋์์ค.(spa)
history API๋ฅผ ์ฌ์ฉํด URL๊ณผ UI๋ฅผ ๋๊ธฐํํ๋ ๋ผ์ฐํฐ
"Route์์ ์ค์ ํ ํ์ฌ ๊ฒฝ๋ก(path)"์ "์ปดํฌ๋ํธ์์ ์ค์ ๋ URL"์ด ์ผ์นํ๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
์์ ์ปดํฌ๋ํธ Route ๋๋ Redirect์ค ๋งค์น๋๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ ๋๋งํฉ๋๋ค.
Routes๋ฅผ ์ฌ์ฉํ๋ฉด BrowserRouter๋ง ์ฌ์ฉํ ๋์ ๋ค๋ฅด๊ฒ, ๋งค์นญ๋๋ ํ๋์ ์์๋ง ๋ ๋๋งํ๋ค๋ ์ ์ ๋ณด์ฅํด์ค๋๋ค. ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ๋งค์นญ๋๋ ๋ชจ๋๋ฅผ ๋ ๋๋งํฉ๋๋ค.
ํ๋์ route์ ํ๋์ ๊ฒฝ๋ก๋ง ๋ณด์ฌ์ฃผ๊ฒ ๋จ.
์ฌ์ฉ์์ url์ฃผ์์ ๋ฐ๋ผ ์ด๋ค ํ์ด์ง๋ฅผ ๋ ๋ํ ์ง ๊ฒฐ์ ๋จ.
(์ ์ ์ ๊ฒฝ๋ก๊ฐ "/"์ด๋ฉด home ์ปดํฌ๋ํธ ๋ ๋, "/movie"์ด๋ฉด Detail ์ปดํฌ๋ํธ ๋ ๋ํจ)
:๋ณ์
๋ฅผ ์ธ ์ ์์.์ด๋ค ๊ฒฝ๋ก๋ก ์ด๋ํ๋๋ผ๋, Nav์ Footer๋ ๊ณ ์ ๋์ ๋์ค๊ฒ๋ ๋จ.
function Router() {
return (
<BrowserRouter>
<Nav />
<Routes>
<Route path="/" element={<Login />} />
<Route path="/signup" element={<Signup />} />
<Route path="/main" element={<Main />} />
</Routes>
<Footer />
</BrowserRouter>
);
}
<App> ์ปดํฌ๋ํธ
: ์ฃผ์์ฐฝ์ "/movie/์๋ฌด๊ฑฐ๋" ์
๋ ฅํ์ ๋, Detail ์ปดํฌ๋ํธ ๋ณด์ฌ๋ฌ๋ผ๋ ๋ป์.
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./routes/Home";
import Detail from "./routes/Detail";
// 1.Route๋ฅผ ์ด์ฉํด ๊ฒฝ๋ก๋ง๋ค ํด๋น๋๋ ์ปดํฌ๋ํธ ์ฐ๊ฒฐํด์ค
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/movie/:id" element={<Detail />} />
</Routes>
</BrowserRouter>
);
}
<Detail> ์ปดํฌ๋ํธ
: " /:id " โ id์ ์ ์ ๊ฐ ์
๋ ฅํ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์.
// 2. Detail์ปดํฌ๋ํธ๋ ๊ฒฝ๋ก์ ๋ณ์๊ฐ ์์. useParams()๋ฅผ ์ด์ฉํด ๊ทธ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์.
import { useParams } from "react-router-dom";
function Detail() {
console.log(useParams()); // {id: '25833'}
// ํด๋น ๊ฒฝ๋ก์ ์ฐ๊ฒฐ๋ ์ปดํฌ๋ํธ์ธ Detail์์, useParam๋ฅผ ์ฐ๋ฉด,
// Route์ path์ ์
๋ ฅ๋ ๋ณ์๋ฅผ ๋ฐ์์ฌ ์ ์๋ค.
// ๋น๊ตฌ์กฐํ ํ ๋น์ผ๋ก id ๋ณ์์ useParams์ ๊ฐ์ฒด๋ฅผ ํ ๋นํจ.
const { id } = useParams(); // id ๊ฐ์ด ๋์จ๋ค!
}
<a>
ํ๊ทธ์ ๋น์ทํจ.
aํ๊ทธ๋ฅผ ์ด์ฉํด ํ์ผ๋ฉด <a href="/movie/id">{title}</a>
์ด๋ฐ์.
โ aํ๊ทธ๋ ํ์ด์ง ์ ์ฒด๊ฐ ๋ค์ ์คํ๋๊ฒ ๋จ. (spa ๊ตฌํx)
to์์ฑ์ ์ค์ ๋ ๋งํฌ๋ก ์ด๋ํจ
๋ธ๋ผ์ฐ์ ์ "์๋ก๊ณ ์นจ ์์ด"๋, ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์์ผ์ฃผ๋ ์ปดํฌ๋ํธ์! (spa ๊ตฌํใ )
import { Link } from "react-router-dom";
function Movies({ id, title }) {
return (
<>
// title์ ๋๋ฅด๋ฉด, `/movie/${id}` ๊ฒฝ๋ก๋ก ์ด๋ํ๊ฒ ๋จ.
<Link to={`/movie/${id}`}>
<h1>{title}</h1>
</Link>
</>
);
}
: ํจ์๋ฅผ ํธ์ถํด์ ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๋ฐฉ๋ฒ์
: ๋ก๊ทธ์ธ ํผ์์ ์ ํจ์ฑ ์ถฉ์กฑ์ ์ด๋ํ ๋ ์ฐ์
import { useNavigate } from "react-router-dom";
const Login = () => {
const [userInfo, setUserInfo] = useState({ userId: "", userPw: "" });
const navigate = useNavigate(); // 1. ํจ์ ํธ์ถํ
const inputChange = (e) => {
const { name, value } = e.target;
setUserInfo((prev) => ({ ...prev, [name]: value }));
};
const loginSucces = (e) => {
if (userInfo.userId && userInfo.userPw) {
navigate("/list"); // 2. ๊ฒฝ๋ก์ค์
}
};
return (
<button type="button" onClick={loginSucces}> ๋ก๊ทธ์ธ </button>
);
};
์ฐธ๊ณ ํฌ์คํ
https://velog.io/@sham/react-router-dom-v6%EB%A1%9C-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0
<Route>
์์ ๋ <Route>
๋ฅผ ๋ฃ์ ์ ์๋๋ฐ ์ด๊ฑธ Nested routes ๋ผ๊ณ ํจ.
: "/event/one" ์ ์์ <Event>
์ <div>์ฒซ ์ฃผ๋ฌธ์</div>
๋ฅผ ๊ฐ์ด ๋ณด์ฌ์ฃผ๊ณ ,
: "/event/two" ์ ์์ <Event>
์ <div>์์ผ๊ธฐ๋
</div>
๋ฅผ ๊ฐ์ด ๋ณด์ฌ์ค๊ฒ ๋๋ค.
nesting๋์๋ ์์(divํ๊ทธ) ๋ฅผ ๋ ๋ํ๊ธฐ์ํด ์์น๋ฅผ ์ง์ ํด ์ค์ผํ๋ค.
์ด๋ฅผ ์ํด Event ์ปดํฌ๋ํธ ์์์ Outletํ๊ทธ๋ก ์์น๋ฅผ ์ง์ ํด ์ค์ผ ํ๋ค.
function App (){
<Routes>
<Route path="/event" element={<Event />}> // 1.
<Route path="one" element={<div>์ฒซ ์ฃผ๋ฌธ์ ์๋ฐฐ์ถ์ฆ ์๋น์ค</div>} /> // 2-1.
<Route path="two" element={<div>์์ผ๊ธฐ๋
์ฟ ํฐ๋ฐ๊ธฐ</div>} /> // 2-2.
</Route>
</Routes>
}
function Event() {
return (
<>
<h1>์ค๋์ ์ด๋ฒคํธ</h1>
<Outlet></Outlet> // 3.
</>
);
}