iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

開始來仔細研究 Next.js 13 的 App router 功能。

首先是基本的定義方式,route 結構是根據 app 目錄底下的內容去定義的,會跟據資料目錄的層狀結構產生對應的路由,這跟以前相同。

<host>/setting/profile 這個網址對應的結構會是

app
└── setting
    └── profile
        └── page.tsx

跟以前不同的是,頁面的主體不是對應路由的名稱或是路由目錄下的 index.tsx ,而是路由目錄下的 page.tsx ,只能是這個名字(如果不是用 typescript 的話會是 page.js)。

這樣帶來了許多方便,因為路由只會去注意 page.tsx 而忽略掉大部分其他的檔案,所以就能夠將該頁面特有的元件或是測試檔案直接放在鄰近的目錄底下集中管理,不用擔心會因此生成路由。

app
└── setting
    └── profile
        ├── components
        │   └── Title.tsx
        ├── page.spec.tsx
        └── page.tsx

再來是動態路由跟以前一樣,用 [] 去定義。

app
└── user
    └── [id]
        └── page.tsx

動態的部分會作為 prop 傳入頁面元件。

export interface IdProps {
  params: {
    id: string;
  };
}

function User({ params: { id } }: IdProps) {
  return (
    <div>
      <h1>Welcome to User! {id}</h1>
    </div>
  );
}

export default User;

Router groups 與 layout

如果不同的頁面之間會有共用的外框結構,例如狀態列跟選單,那應該定義一個 layout 元件在頁面間共用,減少程式碼重複,而且 Next 在切換頁面間也能避免重新渲染 layout 的部分。

路由目錄底下可以定義 layout.tsx ,來給頁面上框。

app
└── settings
    ├── page.tsx
    └── layout.tsx

而要跨頁面共用的話,則要搭配 router groups 功能。

.
└── (auth)
    ├── console
    │   └── page.tsx
    ├── settings
    │   └── page.tsx
    └── layout.tsx

當目錄名稱被 () 框起來時,並不會被算進路由當中,所以像上圖生成的路由會是

<host>/console
<host>/settings

這樣的好處是讓多個頁面可以共用 layout ,並且某些判定可以集中在 layout 中管理,例如檢查使用者是否有登入。


上一篇
部署 Vercel
下一篇
Next App Router 其二
系列文
組裝前端開發工具箱,從 NX 入手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言