react-router (React 라우팅 라이브러리)
1. SPA (Single-page application)
- 페이지를 바꿀 때마다 서버에서 받지말고 -> 첫 페이지 요청시에만 서버에서 html을 내려주고 -> 다른페이지는 페이지에 필요한 부분만 변경해서 보여준다.
- 즉, html은 하나지만, url은 여러개. 이때 필요한 것이 라우팅 처리.
- 라우팅: 어떤 url로 들어왔을때, 특정 페이지를 보여줘야해 (url에 따라 알맞은 콘텐츠(UI)를 전달해주는 기능)
2. react-router 란?
- react-router-dom(웹 개발)과 react-router-native(앱 개발) 기능이 모두 들어있는 라이브러리.
3. react-router-dom (웹 개발)
- BrowserRouter: history API를 사용해서, 브라우저url과 React앱을 연결해주는 역할
- Routes: 모든 Route태그를 감싼다
- Route: 어떤 url로 들어왔을때(path), 어떤 컴포넌트를 보여줄지 매칭(element)
- 기본 예시
import React from 'react';
import HomePage from './components/HomePage'
import { BrowserRouter } from 'react-router-dom';
import ScrollTop from './routes/ScrollTop'
function App() {
return (
<BrowserRouter>
<ScrollTop />
<HomePage />
</BrowserRouter>
);
}
export default App;
import React from 'react';
import { Routes, Route } from 'react-router-dom';
import MainPage from './MainPage';
import TechPage from './TechPage';
import BlogPage from './BlogPage';
import JavascriptPage from './JavascriptPage';
import ReactPage from './ReactPage';
import ReactDocPage from './ReactDocPage';
import ErrorPage from './ErrorPage';
function RouterView() {
return (
<Routes>
<Route path={"/"} element={<MainPage />} /> ---> http://localhost:3000/ (마지막/는 안보인다)
<Route path={"/tech"} element={<TechPage />}> ---> http://localhost:3000/tech
<Route path="react" element={<ReactPage />}> ---> http://localhost:3000/tech/react
<Route path="1" element={<ReactDocPage />} /> ---> http://localhost:3000/tech/react/1
<Route path=":id" element={<BlogPage />} />
</Route>
<Route path="javascript" element={<JavascriptPage />} />
</Route>
<Route path={"/blog"} element={<BlogPage />} /> ---> http://localhost:3000/blog
<Route path={'*'} element={<ErrorPage />} />
</Routes>
);
}
export default RouterView;
import React from 'react';
import Header from './Header';
import RouterView from '../routes/RouterView'
import Footer from './Footer';
import { Link } from 'react-router-dom';
function App() {
return (
<>
<Header />
<div style={{display: 'flex'}}> ---> 라우트 페이지의 크기를 한정시킬수도 있다
<RouterView /> ---> 이 안에서 Link태그 사용은 당연히 가능하다 (이 자체가 BrowserRouter태그 하위에 있기때문에)
</div>
<Footer />
<Link to="/blog">링크 연결해보자</Link> ---> 페이지 이동 Link태그는, 반드시 BrowserRouter태그 안에서만 사용가능하다.
</>
);
}
export default App;
import React from 'react';
import { Outlet, Link } from 'react-router-dom';
function TechPage(props) {
return (
<div>
<h1>TechPage</h1>
<Link to="/tech/react">React</Link> | <Link to="/tech/javascript">Javascript</Link>
<Outlet /> ---> 7번) Outlet 태그는, 어른 컴포넌트의 return 부모 요소의, 가장 마지막 자식 요소로 넣어야 한다.
</div>
);
}
export default TechPage;
import React from 'react';
import { useParams } from 'react-router-dom';
function ReactDocPage(props) {
const params = useParams();
console.log(params);
return (
<div>
ReactDocPage #{ params.id } ---> ReactDocPage #3
</div>
);
}
export default ReactDocPage;
4. 에러 페이지 (404 페이지)
- 만든 페이지 이외에 모든 페이지를, error페이지로
<Routes>
<Route path={'*'} element={<ErrorPage />}></Route> ---> ErrorPage도 직접만든 컴포넌트
</Routes>
<Routes>
<Route path={"/"} element={<MainPage />} />
<Route path={"/tech"} element={<TechPage />}>
<Route path="react" element={<ReactPage />}>
<Route path=":id" element={<ErrorPage />} /> ---> 1번) params로 해놓은 것들은 여기서 연결되고
</Route>
<Route path="javascript" element={<JavascriptPage />} />
</Route>
<Route path={"/blog"} element={<BlogPage />} />
<Route path={'*'} element={<ErrorPage />} /> ---> 2번) 그 외의 나머지 페이지들은 ErrorPage로 간다
</Routes>