children
을 동적으로 렌더링 한다.app/layout.tsx
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en" data-theme="winter">
<body className={inter.className}>{children}</body>
</html>
);
}
관리자 페이지에서 사용할 Admin Layout 을 만들어보자.
layout.tsx
파일을 생성한다.layout
파일 이름 규칙을 반드시 준수해야 한다!app/admin/layout.tsx
import React from "react";
const AdminLayout = () => {
return <div>AdminLayout</div>;
};
export default AdminLayout;
children
이라는 props
를 가져야 한다.props
를 추가하고 children
을 렌더링 한다.React.ReactNode
는 children
프로퍼티 값이 리액트 컴포넌트임을 의미한다.app/admin/layout.tsx
import React from "react";
interface Props {
children: React.ReactNode;
}
const AdminLayout = ({ children }: Props) => {
return (
<div className="flex">
<aside className="bg-slate-200 p-5 mr-5">Admin SideBar</aside>
<div>{children}</div>
</div>
);
};
export default AdminLayout;
layout
파일이 정상 작동하는지 확인하기 위해, admin
폴더 내에 page.tsx
파일을 생성한 후 해당 파일에 기본 컴포넌트를 작성해보자.app/admin/page.tsx
import React from "react";
const AdminHomePage = () => {
return <div>AdminHomePage</div>;
};
export default AdminHomePage;
http://localhost:3000/admin
에 접속해보면 레이아웃이 잘 적용된 것을 확인할 수 있다.app
폴더의 layout
파일은 모든 컴포넌트에 공통으로 적용되는 Global Layoutlayout
파일은 각 폴더의 범위에만 적용되는 Local Layoutlayout
파일명은 Next.js 에서 라우터가 찾는 특수 파일 중 하나이기 때문에 반드시 지켜야 한다.app
폴더에 NavBar.tsx
파일을 생성하고 기본 컴포넌트를 작성한다./users
라우터로 전환하는 Link 컴포넌트를 추가한다.app/NavBar.tsx
import React from "react";
import Link from "next/link";
const NavBar = () => {
return (
<div>
<Link className="mr-5" href="/">
Next.js
</Link>
<Link href="/users">Users</Link>
</div>
);
};
export default NavBar;
app/layout.tsx
파일의 body 태그의 자식 요소로 네비게이션 바를 추가한다.app/layout.tsx
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import NavBar from "./NavBar";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en" data-theme="winter">
<body className={inter.className}>
<NavBar />
<main className="p-5">{children}</main>
</body>
</html>
);
}