动态路由
当您无法提前确定确切的路径段名称,并希望基于动态数据创建路由时,可以使用动态段 (Dynamic Segments),这些动态段会在请求时填充或在构建时进行预渲染。
约定
通过将文件名或文件夹名用方括号包裹即可创建动态段:[segmentName]
。例如 [id]
或 [slug]
。
可以通过 useRouter
访问动态段。
示例
例如,博客可以包含以下路由 pages/blog/[slug].js
,其中 [slug]
是博客文章的动态段。
路由 | 示例 URL | params |
---|---|---|
pages/blog/[slug].js | /blog/a | { slug: 'a' } |
pages/blog/[slug].js | /blog/b | { slug: 'b' } |
pages/blog/[slug].js | /blog/c | { slug: 'c' } |
全捕获段
通过在方括号内添加省略号 [...segmentName]
,可以将动态段扩展为全捕获后续路径段。
例如,pages/shop/[...slug].js
将匹配 /shop/clothes
,同时也会匹配 /shop/clothes/tops
、/shop/clothes/tops/t-shirts
等。
路由 | 示例 URL | params |
---|---|---|
pages/shop/[...slug].js | /shop/a | { slug: ['a'] } |
pages/shop/[...slug].js | /shop/a/b | { slug: ['a', 'b'] } |
pages/shop/[...slug].js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |
可选全捕获段
通过将参数放在双方括号中 [[...segmentName]]
,可以将全捕获段设为可选。
例如,pages/shop/[[...slug]].js
除了会匹配 /shop/clothes
、/shop/clothes/tops
、/shop/clothes/tops/t-shirts
外,还会匹配 /shop
。
全捕获段和可选全捕获段的区别在于,后者在没有参数的情况下也会匹配(如上例中的 /shop
)。
路由 | 示例 URL | params |
---|---|---|
pages/shop/[[...slug]].js | /shop | { slug: [] } |
pages/shop/[[...slug]].js | /shop/a | { slug: ['a'] } |
pages/shop/[[...slug]].js | /shop/a/b | { slug: ['a', 'b'] } |
pages/shop/[[...slug]].js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |