
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>
);
}
Outletreact-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 />로 대체하여 렌더링 해준다.