跳至內容

攔截路由

攔截路由允許您從應用程式中的其他部分載入路由,同時保持目前的佈局。當您想要顯示路由的內容而不讓使用者切換到不同的上下文時,這種路由模式會很有用。

例如,當點擊動態消息中的照片時,您可以在覆蓋動態消息的模態框中顯示照片。在這種情況下,Next.js 會攔截 /photo/123 路由,隱藏網址,並將其覆蓋在 /feed 之上。

Intercepting routes soft navigation

但是,當透過點擊可分享的網址或重新整理頁面來瀏覽照片時,應該渲染整個照片頁面而不是模態框。不應發生路由攔截。

Intercepting routes hard navigation

慣例 (Convention)

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

您可以使用

  • (.) 來匹配**同一級別**的區段
  • (..) 來匹配**上一級別**的區段
  • (..)(..) 來匹配**上兩級別**的區段
  • 使用 (...) 來匹配從根目錄 app 開始的路徑區段。

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

Intercepting routes folder structure

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

範例

模態視窗

路由攔截可以與平行路由一起使用來建立模態視窗。這讓您能解決構建模態視窗時的常見挑戰,例如:

  • 讓模態視窗的內容可以透過網址分享
  • 在頁面重新整理時保留上下文,而不是關閉模態視窗。
  • 在向後導航時關閉模態視窗,而不是前往先前的路由。
  • 在向前導航時重新開啟模態視窗.

考慮以下 UI 模式:使用者可以透過客戶端導航從圖庫開啟照片模態視窗,或直接從可分享的網址導覽至照片頁面。

Intercepting routes modal example

在上述範例中,通往 photo 區段的路徑可以使用 (..) 匹配器,因為 @modal 是一個插槽,而不是一個區段。這表示 photo 路由只比其高一級區段,儘管在檔案系統中高了兩級。

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

注意事項

  • 其他範例包括在頂部導覽列中開啟登入模態視窗,同時也有一個專用的 /login 頁面,或在側邊模態視窗中開啟購物車。