/detail๋ก ์ ์ํ๋ฉด ๋ณด์ฌ์ค ์์ธํ์ด์ง๋ฅผ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ๋ง๋ค์ด์ค์ญ์์ค.
์ค์: ์ปดํฌ๋ํธ์ฉ ํ์ผ์ .js ๋ง๊ณ .jsx ํ์ฅ์๋ก ์ง์ด์ผ Vite ํ๊ฒฝ์์ ์๋ฉ๋๋ค! โ ๏ธ
<div> ๋ด์ฉ์ ๊ฐ์์น์์ ํ์ด์ง ์ ํReact์์๋ ์ง์ ์ฝ๋ ์ง๊ธฐ ๊ท์ฐฎ์ผ๋ react-router-dom ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค! ๐ก
ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด ์ ๋ ฅ:
npm install react-router-dom@6
index.js (๋๋ main.jsx) ํ์ผ ์์ :
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
์
ํ
์๋ฃ! ๐ฆ
1. BrowserRouter importํ๊ธฐ
2. <BrowserRouter>๋ก <App/> ๊ฐ์ธ๊ธฐ
์น์ฌ์ดํธ URL ๊ฒฝ๋ก๋ง๋ค ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋:
// App.js
import { Routes, Route, Link } from 'react-router-dom'
function App(){
return (
// ์๋ต
<Routes>
<Route path="/detail" element={ <div>์์ธํ์ด์ง์</div> } />
<Route path="/about" element={ <div>์ด๋ฐ์ํ์ด์ง์</div> } />
</Routes>
)
}
Routes, Route, Link ์ปดํฌ๋ํธ import<Routes> ๋ง๋ค๊ณ ๊ทธ ์์ <Route> ์์ฑ<Route path="/url๊ฒฝ๋ก" element={ <๋ณด์ฌ์คhtml> } /> ํํ๋ก ์์ฑ<Route path="/" element={ <div>๋ฉ์ธํ์ด์ง์์ ๋ณด์ฌ์ค๊ฑฐ</div> } />
path="/"๋ ๋ฉ์ธํ์ด์ง๋ฅผ ์๋ฏธํฉ๋๋ค! ๐
<Route path="/" element={
<>
<div className="main-bg"></div>
<div className="container">
<div className="row">
{shoes.map((a, i) => {
return <Card shoes={shoes[i]} i={i}></Card>
})}
</div>
</div>
</>
} />
๊ฒฐ๊ณผ:
/) ์ ์ ์์๋ง ์ํ๋ชฉ๋ก ํ์/detail, /about ํ์ด์ง์์๋ ์ํ๋ชฉ๋ก ์จ๊น์ ์ ๋ค์ ์ฃผ์์ฐฝ ์ ๋ ฅ์ด ์๋ ๋งํฌ๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์ด๋ํฉ๋๋ค:
<Link to="/">ํ</Link>
<Link to="/detail">์์ธํ์ด์ง</Link>
ํน์ง:
<Link to="๊ฒฝ๋ก">ํ
์คํธ</Link> ํํ๊ธฐ์กด ๋ฐฉ์ (MPA - Multi Page Application):
ํ์ด์ง ์ด๋ โ ์๋ฒ ์์ฒญ โ ์ HTML ๋ฐ๊ธฐ โ ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ
React ๋ฐฉ์ (SPA):
ํ์ด์ง ์ด๋ โ JS๋ก ์ปดํฌ๋ํธ ๊ต์ฒด โ ๋น ๋ฅธ ํ๋ฉด ์ ํ
SPA์ ์ฅ์ :
1. BrowserRouter vs HashRouter
// BrowserRouter (๊ถ์ฅ)
// URL: https://mysite.com/about
<BrowserRouter>
<App />
</BrowserRouter>
// HashRouter
// URL: https://mysite.com/#/about
<HashRouter>
<App />
</HashRouter>
2. ์๋ฒ ์ค์ ๊ณ ๋ ค์ฌํญ
1. ์ค์ฒฉ ๋ผ์ฐํธ (Nested Routes)
<Routes>
<Route path="/shop" element={<ShopLayout />}>
<Route path="products" element={<Products />} />
<Route path="categories" element={<Categories />} />
</Route>
</Routes>
2. ๋์ ๋ผ์ฐํธ (Dynamic Routes)
<Routes>
<Route path="/product/:id" element={<ProductDetail />} />
<Route path="/user/:userId/posts/:postId" element={<PostDetail />} />
</Routes>
3. ์กฐ๊ฑด๋ถ ๋ผ์ฐํ
function ProtectedRoute({ children }) {
const isAuthenticated = useAuth();
return isAuthenticated ? children : <Navigate to="/login" />;
}
<Route path="/dashboard" element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
} />
1. useNavigate - ํ๋ก๊ทธ๋๋ฐ์ ๋ค๋น๊ฒ์ด์
import { useNavigate } from 'react-router-dom';
function MyComponent() {
const navigate = useNavigate();
const handleClick = () => {
// ์กฐ๊ฑด์ ๋ฐ๋ฅธ ํ์ด์ง ์ด๋
if (isLoggedIn) {
navigate('/dashboard');
} else {
navigate('/login');
}
};
}
2. useLocation - ํ์ฌ ์์น ์ ๋ณด
import { useLocation } from 'react-router-dom';
function MyComponent() {
const location = useLocation();
// ํ์ฌ ๊ฒฝ๋ก์ ๋ฐ๋ฅธ ์กฐ๊ฑด๋ถ ๋ ๋๋ง
const isHomePage = location.pathname === '/';
}
3. useParams - URL ํ๋ผ๋ฏธํฐ ์ ๊ทผ
import { useParams } from 'react-router-dom';
function ProductDetail() {
const { id } = useParams();
// /product/123 ์ ์ ์ id = "123"
}
1. ์ฝ๋ ์คํ๋ฆฌํ (Code Splitting)
import { lazy, Suspense } from 'react';
const About = lazy(() => import('./components/About'));
const Contact = lazy(() => import('./components/Contact'));
function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={
<Suspense fallback={<div>๋ก๋ฉ ์ค...</div>}>
<About />
</Suspense>
} />
</Routes>
);
}
2. ๋ผ์ฐํธ ๊ธฐ๋ฐ ์คํ๋ฆฌํ
// ๊ฐ ํ์ด์ง๋ฅผ ๋ณ๋ ์ฒญํฌ๋ก ๋ถ๋ฆฌ
const routes = [
{
path: '/products',
component: lazy(() => import('./pages/Products'))
},
{
path: '/orders',
component: lazy(() => import('./pages/Orders'))
}
];