跳至內容

4

建立佈局與頁面

到目前為止,您的應用程式只有一個首頁。讓我們學習如何使用佈局頁面建立更多路由。

在本章節中...

以下是我們將涵蓋的主題

使用檔案系統路由建立 dashboard 路由。

了解資料夾和檔案在建立新的路由區段時所扮演的角色。

建立可在多個儀表板頁面之間共用的巢狀佈局。

了解什麼是共同定位、部分渲染和根佈局。

巢狀路由

Next.js 使用檔案系統路由,其中資料夾用於建立巢狀路由。每個資料夾代表一個對應到網址區段路由區段

Diagram showing how folders map to URL segments

您可以使用 layout.tsxpage.tsx 檔案為每個路由建立單獨的 UI。

page.tsx 是一個特殊的 Next.js 檔案,它會匯出一個 React 元件,並且是路由可供存取的必要條件。在您的應用程式中,您已經有一個頁面檔案:/app/page.tsx - 這是與路由 / 相關聯的首頁。

要建立巢狀路由,您可以將資料夾彼此巢狀,並在其中新增 page.tsx 檔案。例如:

Diagram showing how adding a folder called dashboard creates a new route '/dashboard'

/app/dashboard/page.tsx/dashboard 路徑相關聯。讓我們建立這個頁面來看看它是如何運作的!

建立儀表板頁面

/app 內建立一個名為 dashboard 的新資料夾。然後,在 dashboard 資料夾內建立一個新的 page.tsx 檔案,並包含以下內容:

/app/dashboard/page.tsx
export default function Page() {
  return <p>Dashboard Page</p>;
}

現在,請確認開發伺服器正在執行,並瀏覽 https://127.0.0.1:3000/dashboard。您應該會看到「儀表板頁面」的文字。

這就是您在 Next.js 中建立不同頁面的方法:使用資料夾建立新的路由區段,並在其中新增一個 page 檔案。

透過賦予 page 檔案特殊名稱,Next.js 允許您將 UI 元件、測試檔案和其他相關程式碼與您的路由共同定位 (colocate)。只有 page 檔案內的內容可以公開存取。例如,/ui/lib 資料夾與您的路由一起被*共同定位*在 /app 資料夾內。

練習:建立儀表板頁面

讓我們練習建立更多路由。在您的儀表板中,建立另外兩個頁面:

  1. 客戶頁面:此頁面應可在 https://127.0.0.1:3000/dashboard/customers 上存取。目前,它應該返回一個 <p>客戶頁面</p> 元素。
  2. 發票頁面:發票頁面應可在 https://127.0.0.1:3000/dashboard/invoices 上存取。目前,也應返回一個 <p>發票頁面</p> 元素。

花一些時間來完成這個練習,當您準備好後,展開下面的切換開關以查看解答。

建立儀表板佈局

儀表板有一些在多個頁面之間共用的導航功能。在 Next.js 中,您可以使用特殊的 layout.tsx 檔案來建立在多個頁面之間共用的 UI。讓我們為儀表板頁面建立一個佈局!

/dashboard 資料夾內,新增一個名為 layout.tsx 的檔案,並貼上以下程式碼

/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>
  );
}

這段程式碼中發生了一些事情,讓我們來分解一下

首先,您將 <SideNav /> 元件匯入到您的佈局中。您匯入到此檔案的任何元件都將成為佈局的一部分。

<Layout /> 元件會接收一個 children 屬性。這個子元件可以是一個頁面或另一個佈局。在您的情況下,/dashboard 內的頁面將會自動被嵌套在 <Layout /> 內,如下所示

Folder structure with dashboard layout nesting the dashboard pages as children

儲存您的變更並檢查您的 localhost,確認一切正常運作。您應該會看到以下內容

Dashboard page with a sidenav and a main content area

在 Next.js 中使用佈局的一個好處是,在導航時,只有頁面元件會更新,而佈局不會重新渲染。這稱為局部渲染

Folder structure showing the dashboard layout nesting the dashboard pages, but only the pages UI swap on navigation

根佈局

在第 3 章中,您將 Inter 字型匯入到另一個佈局:/app/layout.tsx。提醒一下

/app/layout.tsx
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>
  );
}

這稱為根佈局,是必需的。您新增到根佈局的任何 UI 都將在應用程式中的**所有**頁面之間共用。您可以使用根佈局來修改您的 <html><body> 標籤,並新增中繼資料(您將在後面的章節中了解更多關於中繼資料的資訊)。

由於您剛才建立的新佈局 (/app/dashboard/layout.tsx) 是儀表板頁面專用的,因此您不需要在上面的根佈局中新增任何 UI。

您已完成本章4

很好,儀表板應用程式正慢慢成形。

下一步

5:在頁面之間導航

學習如何使用 `<Link>` 元件在儀表板頁面之間導航。