Segments de route dynamiques
Lorsque vous ne connaissez pas à l'avance les noms exacts des segments de route et que vous souhaitez créer des routes à partir de données dynamiques, vous pouvez utiliser des segments dynamiques qui sont remplis au moment de la requête ou prérendus lors de la construction.
Convention
Un segment dynamique peut être créé en entourant le nom d'un dossier de crochets : [nomDossier]
. Par exemple, un blog pourrait inclure la route suivante app/blog/[slug]/page.js
où [slug]
est le segment dynamique pour les articles de blog.
Les segments dynamiques sont passés comme prop params
aux fonctions layout
, page
, route
, et generateMetadata
.
Route | Exemple d'URL | params |
---|---|---|
app/blog/[slug]/page.js | /blog/a | { slug: 'a' } |
app/blog/[slug]/page.js | /blog/b | { slug: 'b' } |
app/blog/[slug]/page.js | /blog/c | { slug: 'c' } |
Segments attrape-tout
Les segments dynamiques peuvent être étendus pour attraper tous les segments suivants en ajoutant des points de suspension entre les crochets [...nomDossier]
.
Par exemple, app/shop/[...slug]/page.js
correspondra à /shop/clothes
, mais aussi à /shop/clothes/tops
, /shop/clothes/tops/t-shirts
, etc.
Route | Exemple d'URL | params |
---|---|---|
app/shop/[...slug]/page.js | /shop/a | { slug: ['a'] } |
app/shop/[...slug]/page.js | /shop/a/b | { slug: ['a', 'b'] } |
app/shop/[...slug]/page.js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |
Segments attrape-tout optionnels
Les segments attrape-tout peuvent être rendus optionnels en incluant le paramètre dans des doubles crochets : [[...nomDossier]]
.
Par exemple, app/shop/[[...slug]]/page.js
correspondra également à /shop
, en plus de /shop/clothes
, /shop/clothes/tops
, /shop/clothes/tops/t-shirts
.
La différence entre les segments attrape-tout et attrape-tout optionnels est qu'avec l'optionnel, la route sans paramètre est également prise en compte (/shop
dans l'exemple ci-dessus).
Route | Exemple d'URL | params |
---|---|---|
app/shop/[[...slug]]/page.js | /shop | { slug: undefined } |
app/shop/[[...slug]]/page.js | /shop/a | { slug: ['a'] } |
app/shop/[[...slug]]/page.js | /shop/a/b | { slug: ['a', 'b'] } |
app/shop/[[...slug]]/page.js | /shop/a/b/c | { slug: ['a', 'b', 'c'] } |
TypeScript
Lorsque vous utilisez TypeScript, vous pouvez ajouter des types pour params
en fonction du segment de route configuré.
Route | Définition du type params |
---|---|
app/blog/[slug]/page.js | { slug: string } |
app/shop/[...slug]/page.js | { slug: string[] } |
app/shop/[[...slug]]/page.js | { slug?: string[] } |
app/[categoryId]/[itemId]/page.js | { categoryId: string, itemId: string } |
Comportement
- Étant donné que la prop
params
est une promesse, vous devez utiliserasync
/await
ou la fonctionuse
de React pour accéder aux valeurs.- Dans la version 14 et antérieures,
params
était une prop synchrone. Pour faciliter la rétrocompatibilité, vous pouvez toujours y accéder de manière synchrone dans Next.js 15, mais ce comportement sera déprécié à l'avenir.
- Dans la version 14 et antérieures,
Exemples
Avec generateStaticParams
La fonction generateStaticParams
peut être utilisée pour générer statiquement les routes lors de la construction plutôt qu'à la demande lors de la requête.
Lorsque vous utilisez fetch
à l'intérieur de la fonction generateStaticParams
, les requêtes sont automatiquement dédupliquées. Cela évite les appels réseau multiples pour les mêmes données dans les Layouts, Pages et autres fonctions generateStaticParams
, accélérant ainsi le temps de construction.