前回
Next.jsのチュートリアルをやってみる【フォントと画像の最適化編】はじめに
前回までのアプリではホームページだけが存在している状態です。続いて、レイアウトとページを使用してルートを作る方法を学んでいきます。
ネストされたルート
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>;
}
コードを追加したらサーバーが起動されていることを確認し、http://localhost:3000/dashboard
にアクセスすると、「Dashboard Page」という文字列が表示されているはずです。このようにフォルダの中にpage.tsx
を作成すると、様々なページを作成することができます。page
ファイルに特別な名前を付けることではNext.jsではUIコンポーネント、テストファイル、関連コードをルートと一緒に配置することができます。page
ファイル内のコンテンツだけが一般公開されます。例えば/ui
フォルダや/lib
フォルダは/app
フォルダ内にルートと一緒に配置されています。
練習:ダッシュボードページの作成
「ダッシュボードで2つのページを作る」という練習課題が出てきました。回答を確認する前に作成してみましょう。
ページ名 | リンク | 内容 |
---|---|---|
顧客ページ | http://localhost:3000/dashboard/customers | <p>Customers Page</p> 要素を返す |
請求書ページ | http://localhost:3000/dashboard/invoices | <p>Invoices Page</p> 要素を返す |
まずは/app/dashboard
フォルダの中にcustomers
フォルダとinvoices
フォルダを作成します。
続いて/app/dashboard/customer
フォルダの中に以下の内容のpage.tsx
ファイルを作成します。
export default function Page() {
return <p>Customer Page</p>;
}
そして/app/dashboard/invoice
フォルダの中に以下の内容のpage.tsx
ファイルを作成します。
export default function Page() {
return <p>Invoice 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
propを受け取ります。このchildren
はページか別のレイアウトのどちらかになります。今回は/dashboard
の中のページは自動的に<Layout />
の中にネストされます。
変更を保存したら、再度ダッシュボードページを確認してみましょう。以下のような画面が表示されたらレイアウトの反映成功です。
Next.jsでレイアウトを使用すれば、ナビゲーション時にページコンポーネントだけが更新さることです。つまり、レイアウトは再レンダリングせずに、部分レンダリングになるということです。
ルートレイアウト
前回はInter
フォントを/app/layout.tsx
レイアウトにインポートしました。
これはルートレイアウトと呼ばれ、必須ファイルとなります。ルートレイアウトに追加したUIはアプリケーションのすべてのページで共有されます。ルートレイアウトを使用して<html>
タグと<body>
タグを修正してメタデータを追加することができます。今作成した新しいレイアウトの/app/dashboard/layout.tsx
はダッシュボードページ固有のレイアウトとなりますので、ルートレイアウトにUIを追加する必要はありません。
まとめ
- URLはフォルダ階層がマップされたURLになる。
- ルートを作るにはフォルダをネストさせ、その中に
page.tsx
とlayout.tsx
を作成する必要がある。 - ページはルート固有のUIとなる。
- レイアウトは複数のページで共有されるUI
- 一番上のレイアウトはルートレイアウトと呼び、アプリケーション全体で共有される。
- ルートレイアウトには
<html>
タグと<body>
タグを含まなければならない。
- ルートレイアウトには
- レイアウトは再レンダリングされない