-
// App.tsx or router.tsx
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import Layout from "./Layout";
import AuthLayout from "./AuthLayout";
import Home from "./pages/Home";
import Login from "./pages/Login";
import Dashboard from "./pages/Dashboard";
import Profile from "./pages/Profile";
const router = createBrowserRouter([
{
path: "/",
element: <Layout />, // 전체 공통 레이아웃
children: [
{ index: true, element: <Home /> },
{ path: "login", element: <Login /> },
{
element: <AuthLayout />, // 아래 라우트들에 인증 체크 적용됨
children: [
{ path: "dashboard", element: <Dashboard /> },
{ path: "profile", element: <Profile /> },
],
},
],
},
]);
export default function App() {
return <RouterProvider router={router} />;
}
-
// AuthLayout.tsx
import { Outlet, useLocation, Navigate } from "react-router-dom";
import { useAuth } from "./auth-context";
export default function AuthLayout() {
const { isLoggedIn } = useAuth();
const location = useLocation();
if (!isLoggedIn) {
return <Navigate to="/login" state={{ from: location }} />;
}
return <Outlet />;
}
- outlet을 suspense로 감싸는 구조
-
import { Outlet } from "react-router-dom";
export default function Layout() {
return (
<div>
<nav>
<Link href="/">Home</a>
<Link href="/about">About</a>
<Link href="/profile">Profile</a>
</nav>
<main>
<Outlet />
</main>
</div>
);
}