노마드 마스터클래스 강의 중
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;