리액트 라우터 구현 ^6.4 (BrowserRouter와 createBrowserRouter)

김민아·2023년 1월 2일
9

router 구현

노마드 마스터클래스 강의 중 BrowserRouter와 createBrowserRouter를 복습하면서 정리한 내용입니다.

# npm 특정 버전 설치는 
npm install <package-name>@<version>

# npm 최신 버전 설치는 
npm install <package-name>@latest

BrowserRouter

react에서 router를 구현할 때 react-router-dom의 BrowserRouter, Routes, Route, Link 컴포넌트를 사용한다.

예를 들면, BrowserRouter은 react-router-dom 컴포넌트를 감싸는 최상단에 위치한다. 그리고 Routes 하위에 경로에 따라 Routeelement에 전달한 컴포넌트로 분기하는 식이다.

// 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

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()

createBrowserRouter()에 라우팅 할 pathelement로 작성할 수 있다. 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 />

RouterRroviderrouter를 넘기면, 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;

전체 코드


출처

0개의 댓글