๋ฆฌ์กํธ ๋ผ์ฐํฐ 6.3.0 ๋ฒ์ ์ ์ค์น
npm install react-router-dom@latest
//โ๏ธ์ฐธ๊ณ ) ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ ๋ฒ์ ์ ๋ฐ๋ผ ์ฌ์ฉ๋ฒ์ด ๋ค๋ฅด๋ค.
History API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ค๋ค.
(์ฆ, UI๋ฅผ URL๊ณผ ๋๊ธฐํ๋ ์ํ๋ฅผ ์ ์งํด์ฃผ๋ ์ญํ )
์์์ ์์ฑ๋์ด์ผ React Router์ ์ปดํฌ๋ํธ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
์๋์ ๊ฐ์ด ReactDOM์ ๋ ๋ ๋จ๊ณ์ธ index.js ์์๋ ํ์ฉ ๊ฐ๋ฅ.
// index.js (React Version 18 ๊ธฐ์ค)
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
-----
// index.js (React Version 17 ๊ธฐ์ค)
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(<BrowserRouter><App/></BrowserRouter>, document.querySelector('#root'));
๊ฒฝ๋ก๋ฅผ ๋งค์นญํด์ฃผ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ.
โท Routes
Route Configํ๋ ๊ฒฝ๋ก ๊ฐ์ฒด ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค. Route๋ Routes์์์๋ง ์ ํจํ๋ค.
(Route๋ก ์์ฑ๋ ์์ ์ปดํฌ๋ํธ ์ค์์ ๋งค์นญ๋๋ ์ฒซ๋ฒ์งธ Route๋ฅผ ๋ ๋๋งํ๋ ์ญํ )
โท Route
path๊ฐ ํ์ฌ URL๊ณผ ์ผ์นํ๋ฉด element๊ฐ ๋ ๋๋ง ๋๋ค.
๋ผ์ฐํ ์์
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/MyPage" element={<MyPage />} />
<Route path="/Dashboard" element={<Dashboard />} />
</Routes>
</BrowserRouter>
ํด๋น ์ปดํฌ๋ํธ๋ฅผ ํด๋ฆญํ ๋, Route์ path์ ์ผ์นํ๋ ํ์ด์ง๋ก ์ด๋ํ ์ ์๊ฒ ํด์ฃผ๋ ์ปดํฌ๋ํธ์ด๋ค.
<Link to="path" />
๋งํฌ ์์
import { BrowserRouter, Routes, Route, Link } from "react-router-dom"
function App() {
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/MyPage" element={<MyPage />} />
<Route path="/Dashboard" element={<Dashboard />} />
</Routes>
</BrowserRouter>
}
function Home() {
return (
<>
<h1>Home</h1>
<Link to="/MyPage">MyPage</Link> | <Link to="/Dashboard">Dashboard</Link>
</>
);
}
// MyPage ์ปดํฌ๋ํธ
function MyPage() {
return <h1>MyPage</h1>;
}
// Dashboard ์ปดํฌ๋ํธ
function Dashboard() {
return <h1>Dashboard</h1>;
}
export default App;
Link ์์ ๋ฒํผ์ด ์์ผ๋ฉด ํค๋ณด๋๋ก ํญ ํ์ ์ ๋๋ฒ ์กํ๋ค.
ํ๋ฒ๋ง ์กํ๊ฒ ํ๋ ค๋ฉด ๋ฒํผ์ tabIndex='-1'
๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
<Link to='/signup'>
<button className='signup' tabIndex='-1'>
<div className='signup-bg'>
<span>Sign up</span>
</div>
</button>
</Link>
Outlet์ ๋ผ์ฐํ ์ด ์ค์ฒฉ๋ ๋ ์ฌ์ฉํ๋ค.
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/MyPage" element={<MyPage />}>
<Route path="/Dashboard" element={<DashboardPage />} />
</Route>
</Routes>
</BrowserRouter>
-----
/* MyPage */
<div>
<h1>MyPage</h1>
<Link to="/MyPage/Dashboard">Dashboard<Link>
<Outlet /> /* Dashboard์ component๊ฐ Outlet์ ์์น์ ์์นํ๊ฒ ๋๋ค. */
</div>
PrivateRoute
import { Outlet, Navigate } from 'react-router-dom';
import { getCookie } from 'src/utils/cookie';
function PrivateRoute() {
const access = getCookie('access');
return (
access ? <Outlet /> : <Navigate to="/signin" />
);
}
export default PrivateRoute;
pathname์ ์์๋ผ ์ ์๋ค.
import { useLocation } from 'react-router-dom';
const { pathname } = useLocation();
์ฟผ๋ฆฌ ์์๋ด๊ธฐ
const { search } = useLocation();
const query = new URLSearchParams(search).get('q');
ํ์ฌ ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ์๋์ง
import { useMatch } from 'react-router-dom';
const isInterestPage = useMatch('/interest');
ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
/* App.js */
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/MyPage" element={<MyPage />} />
<Route path="/Dashboard/:id" element={<DashboardPage />} />
</Routes>
</BrowserRouter>
-----
/* MyPage.js */
return (
<>
{data.map(item => (
<Link to={`/Dashboard/${item.id}`} key={item.id}>
<h2>{item.title}</h2>
</Link>
))}
</>
)
-----
/* DashboardPage.js */
const {id} = useParams();
return <div>DashboardPage {id}</div>
์์์ด ์ ์ถ๋๊ฑฐ๋ ํน์ event๊ฐ ๋ฐ์ํ ๋, url์ ์กฐ์ํ ์ ์๋ interface๋ฅผ ์ ๊ณตํ๋ค.
๊ฐ๋จํ ์์
const navigate = useNavigate(); /* ๋ณ์์ ์ ์ฅํด์ ์ฌ์ฉ*/
return <h1 onClick={() => navigate("/")}>logo</h1>
/* ์ด๋ ๊ฒ ํ๋ฉด logo๋ฅผ ํด๋ฆญํ์ ๋ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋จ */
๋ค๋ก๊ฐ๊ธฐ / ์์ผ๋ก๊ฐ๊ธฐ ์์
const navigate = useNavigate();
const goBack = () => {
navigate(-1);
// history.go(-1)
}
const goForward = () => {
navigate(1);
// history(1)
}
return (
<>
<button onClick={goBack}>๋ค๋ก๊ฐ๊ธฐ</button>
<button onClick={goForward}>์์ผ๋ก๊ฐ๊ธฐ</button>
</>
)
replace
navigate('/news/all', { replace: true });
๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ง์ ๋์ง ์์ ์ฃผ์๋ก ์ ๊ทผํ ์ ์ด ์์ฑ์ด ์ค์ ๋์ด ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
/* ์๋จ์ ์์นํ๋ ๋ผ์ฐํธ๋ค์ ๊ท์น์ ๋ชจ๋ ํ์ธ, ์ผ์นํ๋ ๋ผ์ฐํธ๊ฐ ์๋๊ฒฝ์ฐ ์ฒ๋ฆฌ */
<Route path="*" element={<NotFound />}></Route>
ํ์ฌ URL ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ๋ฐํํด ์ฃผ๋ ์ญํ ์ ํ๋ค.
ํ์ฌ ํ์ด์ง์ ๊ฒฝ๋ก๋ฅผ ํ์
ํ๊ฑฐ๋, ์ฟผ๋ฆฌ ์คํธ๋ง ๋ฑ URL์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
ํ์ด์ง๋ง๋ค ๋ฐฐ๊ฒฝ ์์์ ๋ค๋ฅด๊ฒ ์ฃผ๊ณ ์ถ์ ๋ ์์
/* GlobalStyle.js */
import { createGlobalStyle } from 'styled-components';
import { useLocation } from 'react-router-dom';
const GlobalStyled = createGlobalStyle`
body {
background-color: ${({ backgroundColor }) => backgroundColor || '#FFF'};
}
`;
export function BackgroundColor() {
const location = useLocation();
let backgroundColor;
switch (location.pathname) {
case '/login':
case '/signup':
backgroundColor = '#F1F2F3';
break;
default:
backgroundColor = '#FFF';
}
return <GlobalStyled backgroundColor={backgroundColor} />;
}
/* App.js */
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { BackgroundColor } from './GlobalStyle';
function App() {
return (
<>
<BrowserRouter>
<BackgroundColor /> // ์ฌ๊ธฐ์ ์ถ๊ฐํจ
<Routes>
<Route ...>
</Routes>
</BrowserRouter>
</>
);
}
export default App;
์ผ์นํ๋ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ์คํ์ผ ๋๋ ํด๋์ค๋ฅผ ์ ์ฉํ ์ ์๋๋ก ๋์์ค๋ค.
์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฐฉ๋ฒ
import { NavLink } from 'react-router-dom';
<NavLink
to="/home"
style={({ isActive }) => (isActive ? { opacity: 1 } : {})}
>
Home
</NavLink>
styled-components์ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
const StyledLink = styled(NavLink)`
text-decoration: none;
margin-right: 78px;
&:last-of-type {
margin-right: 0;
}
span {
color: var(--white-100);
display: flex;
justify-content: center;
align-items: center;
font-weight: 600;
font-size: 16px;
opacity: 0.6;
}
&.active span { ~~~์ด ๋ถ๋ถ์~~~
opacity: 1;
}
button {
display: flex;
justify-content: center;
align-items: center;
}
`;
.....
<StyledLink to={`/feed/${groupId}`}>
<button>
<span>Feed</span>
</button>
</StyledLink>
const navigate = useNavigate();
navigate(`/search?q=${query}`);
const location = useLocation();
const { search } = useLocation();
const query = new URLSearchParams(search).get('q');