react-router-dom v6에 대해 알아보자.
import { createBrowserRouter } from "react-router-dom";
import Root from "./Root";
import About from "./About";
import Home from "./Home";
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
children: [
{
path: "",
element: <Home />,
},
{
path: "about",
element: <About />,
},
],
},
]);
export default router;
createBrowerRouter
를 통해서 라우터를 생성한다. []
형태로 입력하며 각각의 오브젝트는 path
, element
를 갖는다. path
경로로 접속하면 element
의 컴포넌트를 렌더링해 준다.
children
은 []
형태로 입력하며 /
경로의 하위 경로이다. 각각의 요소를 보자.
{ path: "", element: <Home />, },
/
로 접속할 경우 <Home>
을 렌더링한다.
{ path: "about", element: <About />, },
/about
으로 접속할 경우 <About>
을 렌더링 한다.
하지만 /
이든 /about
이든 접속할 경우 하위 컴포넌트들은 무시당한 채로 <Root>
만 보이게된다. 아래에 해결하는 방법을 알아보자.
import { Outlet } from "react-router-dom";
import Header from "./components/Header";
export default function Root() {
return (
<div>
<Header />
<Outlet />
</div>
);
}
Outlet
react-router-dom
의 Outlet
은 children
의 컴포넌트들을 렌더링해 준다.
/
로 접속할 경우 <Outlet />
은 <Home />
으로 대체되어 질 것이다.
마찬가지로 /about
으로 접속할 경우 <Outlet />
은 <About />
으로 대체되어 질 것이다.
import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import router from "./Router";
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
root.render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>
);
우리는 위에서 작성한 Router들의 존재를 알려야한다. RouterProvider
를 통해 수행할 수 있다. <RouterProvider router={router} />
와 같이 작성 하면된다.
errorElement
값을 통해서 에러를 처리할 수 있다.
import { createBrowserRouter } from "react-router-dom";
import ErrComponent from "./components/ErrComponent";
import Root from "./Root";
import About from "./screens/About";
import Home from "./screens/Home";
import NotFound from "./screens/NotFound";
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
children: [
{
path: "",
element: <Home />,
errorElement: <ErrComponent />,
},
{
path: "about",
element: <About />,
},
],
errorElement: <NotFound />,
},
]);
export default router;
위에서 작성했던 Router.tsx파일을 수정했다. 각 요소에 대해 에러를 처리할수 있다.
/
로 접속하여 에러가 나는 경우 <NotFound />
를 렌더링 한다. 예를 들어 /test
와 같이 잘못 된 경로로 접속한다면 <NotFound />
를 렌더링 하게된다.
/
로 접속하고 <Home />
을 렌더링 하는 중에 에러가 발생한다면 <Home />
을 <ErrComponent />
로 대체하여 렌더링 해준다.