노마드 마스터클래스 강의 중
BrowserRouter와 createBrowserRouter를 복습하면서 정리한 내용입니다.
# npm 특정 버전 설치는 npm install <package-name>@<version> # npm 최신 버전 설치는 npm install <package-name>@latest
react에서 router를 구현할 때 react-router-dom의 BrowserRouter, Routes, Route, Link 컴포넌트를 사용한다.
예를 들면, BrowserRouter은 react-router-dom 컴포넌트를 감싸는 최상단에 위치한다. 그리고 Routes 하위에 경로에 따라 Route의 element에 전달한 컴포넌트로 분기하는 식이다.
// App.tsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Header from './Components/Header';
import Home from './pages/Home';
import About from './pages/About';
function App() {
return (
<BrowserRouter>
<Header />
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/about" element={<About />}></Route>
</Routes>
</BrowserRouter>
);
}
export default App;
Link 컴포넌트 역시 BrowserRouter에 포함되어야 하며, to={path}가 가리키는 경로로 url이 바뀌며 위 라우터가 동작한다.
// Header.tsx
import { Link } from 'react-router-dom';
function Header() {
return (
<header>
<h1>Hello, Router</h1>
<nav>
<ul>
<li>
<Link to={'/'}>Home</Link>
</li>
<li>
<Link to={'/about'}>About</Link>
</li>
</ul>
</nav>
</header>
);
}
export default Header;

createBrowserRouter는 react router v6.4부터 사용할 수 있다.
<RouterRrovider /><BrowserRout>로 감싸지 않고 최상단에서 index.tsx에서 <RouterProvider> 를 import한다.
RouterRrovider에는 router={} props를 필수로 넣어야 하는데, Router.tsx에서 createBrowserRouter 함수로 생성한 router를 넘겨준다. (자세한 내용은 아래 코드로)
// index.tsx
import { RouterProvider } from 'react-router-dom';
import router from './Router';
root.render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>,
);
createBrowserRouter()에 라우팅 할 path와 element로 작성할 수 있다. children 속성으로 배열에 중첩된 라우터(Nested Router)를 추가해 줄 수 있다.
// Router.tsx
import { createBrowserRouter } from 'react-router-dom';
import About from './pages/About';
import Home from './pages/Home';
import App from './App';
const router = createBrowserRouter([
{
path: '/',
element: <App />,
children: [
{
path: '',
element: <Home />,
},
{
path: 'about',
element: <About />,
},
],
},
]);
export default router;
<Outlet />RouterRrovider에 router를 넘기면, root 경로인 <App /> 컴포넌트만 출력된다. 하위 경로(/ + "", / + about)에 알맞는 컴포넌트를 출력하기 위해서 App.tsx에 <Outlet /> 을 추가한다.
// App.tsx
import { Outlet } from 'react-router-dom';
import Header from './Components/Header';
function App() {
return (
<div>
<Header />
<Outlet />
</div>
);
}
export default App;