현재 아래와 같이 App.jsx에서 모든 라우팅을 관리하고 있습니다. 아래처럼 라우팅 페이지를 관리했을 때 다음과 같은 불편함을 느꼈습니다.
// App.tsx
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { ROUTES } from "./constant";
import Layout from "./Layout";
import Main from "./pages/Main";
import About from "./pages/About";
import Fruits from "./pages/Fruits";
import Apple from "./pages/Apple";
import Banana from "./pages/Banana";
export default function App() {
return (
<BrowserRouter>
<Routes>
<Route path={ROUTES.HOME} element={<Layout />}>
<Route index element={<Main />} />
<Route path={ROUTES.ABOUT} element={<About />} />
<Route path={ROUTES.FRUITS.INDEX} element={<PublicRoute Component={Fruits} restricted={restricted} />}>
<Route path={ROUTES.FRUITS.APPLE} element={<PrivateRtoue Component={Apple} restricted={restricted} />} />
<Route path={ROUTES.FRUITS.BANANA} element={<Banana />} />
</Route>
</Route>
</Routes>
</BrowserRouter>
);
}
// Layout.tsx
import { Link, Outlet } from "react-router-dom";
import { ROUTES } from "./constant";
const Layout = () => {
return (
<div>
<ul style={{ display: "flex", flexDirection: "column" }}>
<Link to={ROUTES.HOME}>HOME</Link>
<Link to={ROUTES.ABOUT}>ABOUT</Link>
<Link to={ROUTES.FRUITS.INDEX}>FRUITS</Link>
<Link to={ROUTES.FRUITS.APPLE}>APPLE of FRUITS</Link>
<Link to={ROUTES.FRUITS.BANANA}>BANANA of FRUITS</Link>
</ul>
<Outlet />
</div>
);
};
export default Layout;
// Fruits.tsx
import { Outlet } from "react-router-dom";
const Fruits = () => {
return (
<div>
<h1>Fruits</h1>
<Outlet />
</div>
);
};
export default Fruits;
react-router-dom-v6에서 제공하는 useRoutes를 활용해 /src/routes/index.jsx에서 모든 라우팅을 관리하도록 했습니다.
const routes = [
{
path: ROUTES.HOME,
element: <Main />
},
{
path: ROUTES.ABOUT,
element: <About />
},
{
path: ROUTES.FRUITS.INDEX + ROUTES.ALL,
element: <FruitRouter />
}
];
const Router = () => {
const element = [
{
element: <Layout />,
children: routes
}
];
return useRoutes(element);
};
이전에는 <Route>컴포넌트 마다 아래와 같이 Public인지 Private인지 element를 감싸는 형태로 코드를 작성했습니다.