拦截路由

拦截路由允许你在当前布局中加载来自应用其他部分的路由。当需要在保持当前上下文的情况下展示路由内容时,这种路由模式非常有用。

例如,当用户点击信息流中的照片时,你可以在模态框中展示该照片并覆盖原信息流。此时 Next.js 会拦截 /photo/123 路由,隐藏实际 URL 并将其覆盖在 /feed 路径上。

拦截路由的软导航

但当通过可分享链接直接访问照片或刷新页面时,应当渲染完整的照片页面而非模态框。此时不会触发路由拦截。

拦截路由的硬导航

约定

拦截路由可通过 (..) 约定来定义,这与相对路径约定 ../ 类似,但作用于路由片段。

你可以使用:

  • (.) 匹配同级片段
  • (..) 匹配上一级片段
  • (..)(..) 匹配上两级片段
  • (...) 匹配从根 app 目录开始的片段

例如,通过在 feed 片段内创建 (..)photo 目录,可以拦截来自上一级的 photo 片段。

拦截路由的文件夹结构

注意 (..) 约定基于_路由片段_而非文件系统层级。

示例

模态框

拦截路由可与并行路由结合实现模态框,解决以下常见问题:

  • 通过 URL 实现模态内容可分享
  • 页面刷新时保留上下文而非关闭模态框
  • 后退导航时关闭模态框而非返回上一路由
  • 前进导航时重新打开模态框

参考以下 UI 模式:用户既可通过客户端导航在相册中打开照片模态框,也可通过分享链接直接访问照片页面:

拦截路由模态框示例

上例中,由于 @modal 是插槽而非片段,photo 路径只需使用 (..) 匹配器。这意味着尽管文件系统层级相差两级,但路由片段仅高一级。

查看并行路由文档获取分步示例,或参考我们的图片库示例

须知:

  • 其他应用场景包括:在顶部导航栏打开登录模态框的同时保留独立 /login 页面,或在侧边栏打开购物车模态框。

On this page