4
チャプター4
レイアウトとページを作成する
現時点では、アプリケーションにはホームページしかありません。レイアウトとページを使って、さらに多くのルートを作成する方法を学びましょう。
このチャプターでは...
カバーするトピックは以下の通りです
ファイルシステムルーティングを使用してdashboard
ルートを作成する。
新しいルートセグメントを作成する際のフォルダとファイルの役割を理解する。
複数のダッシュボードページ間で共有できるネストされたレイアウトを作成する。
コロケーション、部分レンダリング、ルートレイアウトがそれぞれ何であるかを理解する。
ネストされたルーティング
Next.jsはファイルシステムルーティングを使用しており、フォルダを使ってネストされたルートを作成します。各フォルダは、URLセグメントに対応するルートセグメントを表します。

layout.tsx
ファイルとpage.tsx
ファイルを使用して、各ルートに個別のUIを作成できます。
page.tsx
は、Reactコンポーネントをエクスポートする特別なNext.jsファイルであり、ルートがアクセス可能であるために必要です。アプリケーションにはすでにページファイル/app/page.tsx
があります。これはルート/
に関連付けられたホームページです。
ネストされたルートを作成するには、フォルダを互いにネストし、その中にpage.tsx
ファイルを追加します。例:

/app/dashboard/page.tsx
は/dashboard
パスに関連付けられています。動作を確認するためにページを作成してみましょう!
ダッシュボードページの作成
/app
内にdashboard
という新しいフォルダを作成します。次に、dashboard
フォルダ内に以下の内容で新しいpage.tsx
ファイルを作成します。
export default function Page() {
return <p>Dashboard Page</p>;
}
さて、開発サーバーが実行されていることを確認し、https://:3000/dashboardにアクセスしてください。「Dashboard Page」というテキストが表示されるはずです。
これがNext.jsで異なるページを作成する方法です。フォルダを使用して新しいルートセグメントを作成し、その中にpage
ファイルを追加します。
page
ファイルに特別な名前を付けることで、Next.jsはUIコンポーネント、テストファイル、およびその他の関連コードをルートとコロケートすることができます。page
ファイル内のコンテンツのみが公開アクセス可能です。例えば、/ui
と/lib
フォルダは、ルートと一緒に/app
フォルダ内にコロケートされています。
演習:ダッシュボードページの作成
さらにルートを作成する練習をしましょう。ダッシュボードで、さらに2つのページを作成します。
- 顧客ページ:このページは、https://:3000/dashboard/customersでアクセスできる必要があります。今のところ、
<p>Customers Page</p>
要素を返すようにしてください。 - 請求書ページ:請求書ページは、https://:3000/dashboard/invoicesでアクセスできる必要があります。今のところ、
<p>Invoices Page</p>
要素も返すようにしてください。
この演習に取り組むのに時間をかけ、準備ができたら、以下のトグルを展開して解答を確認してください。
ダッシュボードレイアウトの作成
ダッシュボードには、複数のページで共有されるナビゲーション機能があります。Next.jsでは、特別なlayout.tsx
ファイルを使用して、複数のページ間で共有されるUIを作成できます。ダッシュボードページ用のレイアウトを作成しましょう!
/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>
);
}
このコードにはいくつかの要素があるので、分解して見ていきましょう。
まず、<SideNav />
コンポーネントをレイアウトにインポートしています。このファイルにインポートするすべてのコンポーネントは、レイアウトの一部になります。
<Layout />
コンポーネントはchildren
プロップを受け取ります。この子要素はページであるか、別のレイアウトであることができます。今回の場合、/dashboard
内のページは自動的に<Layout />
内にネストされます。

変更を保存してローカルホストを確認し、すべてが正しく動作しているか確認してください。以下が表示されるはずです。

Next.jsでレイアウトを使用する利点の1つは、ナビゲーション時にレイアウトが再レンダリングされず、ページコンポーネントのみが更新されることです。これは部分レンダリングと呼ばれ、ページ間の遷移時にレイアウト内のクライアントサイドReactステートを保持します。

ルートレイアウト
第3章では、別のレイアウト、つまり/app/layout.tsx
にInter
フォントをインポートしました。補足として:
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>
);
}
これはルートレイアウトと呼ばれ、すべてのNext.jsアプリケーションで必須です。ルートレイアウトに追加するUIは、アプリケーション内のすべてのページで共有されます。ルートレイアウトを使用して、<html>
タグと<body>
タグを変更したり、メタデータを追加したりできます(メタデータの詳細については後のチャプターで学びます)。
作成したばかりの新しいレイアウト(/app/dashboard/layout.tsx
)はダッシュボードページに固有のものであるため、上記のルートレイアウトにUIを追加する必要はありません。
チャプターを完了しました4
よし、ダッシュボードアプリが少しずつ形になってきましたね。
これは役に立ちましたか?