【4章】Next.jsのチュートリアルをやってみた
これはNext.js の公式チュートリアルの 4. Creating Layouts and Pages やってみたメモです
前章のメモ
Next.js の公式チュートリアルの該当ページ
学ぶこと
- ファイルベースルーティングを使用してダッシュボードページを作る
- 新しいルートセグメントを作ったときのフォルダやファイルの理解
- 複数のダッシュボード間で共有できるレイアウトの作成
- コロケーション、部分レンダリング、ルート レイアウトとは何か
ルーティング
Next.js はファイルベースルーティングを採用しています。
各フォルダにある page.tsxおよび layout.tsxがパスにアクセスした際の UI を定義しています。
なので、example.com にホスティングされているアプリでは、
- example.com/ にアクセス ⇒ /app/page.tsxを表示
- example.com/dashboardにアクセス ⇒ /app/dashboard/page.tsxを表示
ダッシュボードページを作成する
/dashboardのパスでアクセスしたいので、/app/dashboard/page.tsxを作成します
export default function Page() {
return <p>Dashboard Page</p>;
}
http://localhost:3000/dashboard にアクセスして確認してみましょう
「Dashboard Page」と表示されれば OK です!
ほかにも特別なフォルダやファイルがあるので、公式ドキュメントを見てみてください!
他のページも作ってみる
-
カスタマーページ
- http://localhost:3000/dashboard/customers でアクセス
- <p>Customers Page</p> を表示
-
請求書ページ
- http://localhost:3000/dashboard/invoices でアクセス
- <p>Invoices Page</p> を表示
/app/dashboard/customers/page.tsxと /app/dashboard/invoices/page.tsx を作成します
export default function Page() {
return <p>Customers Page</p>;
}
export default function Page() {
return <p>Invoices Page</p>;
}
http://localhost:3000/dashboard/customers と
http://localhost:3000/dashboard/invoices にアクセスして確認してみましょう!
ダッシュボードレイアウトを作成する
layout.tsxというファイルは、複数のページで UI を共有できます
ダッシュボードのレイアウト(/app/dashboard/layout.tsx)を作成していきます。
import SideNav from '@/app/ui/dashboard/sidenav';
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
<div className="w-full flex-none md:w-64">
<SideNav />
</div>
<div className="flex-grow p-6 md:overflow-y-auto md:p-12">{children}</div>
</div>
);
}
/app/ui/dashboard/sidenav.tsx からインポートした SideNav コンポーネントをサイドバーとして表示
別のレイアウトや内容は引数(children)に入ってきます。
-> page.tsx で書いたコードの内容が layout.tsx の children に入ってくるイメージですね
http://localhost:3000/dashboard にアクセスして確認してみましょう
左側にサイドバーが表示されていれば OK です!
レイアウトを使用するメリット
Next.js でレイアウトを利用するメリットの 1 つは、部分レンダリングされることです。
ルートレイアウト
/app/layout.tsx はルートレイアウトと呼ばれ、アプリ全体の UI を定義しています。
import '@/app/ui/global.css';
import { inter } from '@/app/ui/fonts';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body className={`${inter.className} antialiased`}>{children}</body>
</html>
);
}
次章のメモ
Discussion