动态路由
当您无法提前获知确切的路径段名称,并希望根据动态数据创建路由时,可以使用动态段 (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: undefined } |
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'] } |