跳到內容

攔截路由

攔截路由允許您在目前的版面配置中,載入來自應用程式另一部分的路由。當您想要顯示路由的內容,而使用者無需切換到不同的情境時,這種路由模式非常有用。

例如,當點擊動態消息中的照片時,您可以將照片顯示在彈出視窗中,覆蓋在動態消息之上。在這種情況下,Next.js 攔截了 /photo/123 路由,遮蔽了 URL,並將其覆蓋在 /feed 之上。

Intercepting routes soft navigation

但是,當透過點擊可分享的 URL 或重新整理頁面導航到照片時,應該渲染整個照片頁面,而不是彈出視窗。不應發生路由攔截。

Intercepting routes hard navigation

慣例

攔截路由可以使用 (..) 慣例來定義,這類似於相對路徑慣例 ../,但用於區段。

您可以使用

  • (.) 來比對相同層級的區段
  • (..) 來比對上一層級的區段
  • (..)(..) 來比對上兩層級的區段
  • (...) 來比對來自 根目錄 app 的區段

例如,您可以透過建立 (..)photo 目錄,從 feed 區段內攔截 photo 區段。

Intercepting routes folder structure

請注意,(..) 慣例是基於路由區段,而不是檔案系統。

範例

彈出視窗

攔截路由可以與平行路由一起使用,以建立彈出視窗。這讓您可以解決建置彈出視窗時常見的挑戰,例如

  • 使彈出視窗內容可透過 URL 分享
  • 在頁面重新整理時保留情境,而不是關閉彈出視窗。
  • 在後退導航時關閉彈出視窗,而不是前往上一個路由。
  • 在前進導航時重新開啟彈出視窗.

考慮以下 UI 模式,使用者可以使用用戶端導航從圖庫開啟照片彈出視窗,或直接從可分享的 URL 導航到照片頁面

Intercepting routes modal example

在上面的範例中,photo 區段的路徑可以使用 (..) 比對器,因為 @modal 是一個插槽,而不是一個區段。這表示 photo 路由僅高一個區段層級,儘管在檔案系統中高兩個層級。

請參閱平行路由文件以取得逐步範例,或參閱我們的圖片庫範例

要知道

  • 其他範例可能包括在頂部導航欄中開啟登入彈出視窗,同時也有一個專用的 /login 頁面,或在側邊彈出視窗中開啟購物車。