Routes dynamiques
Lorsque vous ne connaissez pas à l'avance les noms exacts des segments 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 au moment de la construction.
Convention
Un segment dynamique peut être créé en entourant le nom d'un dossier de crochets : [nomDuDossier]
. Par exemple, [id]
ou [slug]
.
Les segments dynamiques sont passés comme prop params
aux fonctions layout
, page
, route
, et generateMetadata
.
Exemple
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.
export default function Page({ params }: { params: { slug: string } }) {
return <div>Mon article : {params.slug}</div>
}
export default function Page({ params }) {
return <div>Mon article : {params.slug}</div>
}
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' } |
Consultez la page generateStaticParams() pour apprendre à générer les paramètres du segment.
Bon à savoir : Les segments dynamiques sont équivalents aux routes dynamiques dans le répertoire
pages
.
Génération de paramètres statiques
La fonction generateStaticParams
peut être utilisée en combinaison avec des segments de route dynamique pour générer statiquement les routes au moment de la construction plutôt qu'à la demande.
export async function generateStaticParams() {
const posts = await fetch('https://.../posts').then((res) => res.json())
return posts.map((post) => ({
slug: post.slug,
}))
}
export async function generateStaticParams() {
const posts = await fetch('https://.../posts').then((res) => res.json())
return posts.map((post) => ({
slug: post.slug,
}))
}
Le principal avantage de la fonction generateStaticParams
est sa récupération intelligente des données. Si le contenu est récupéré dans la fonction generateStaticParams
à l'aide d'une requête fetch
, les requêtes sont mémorisées automatiquement. Cela signifie qu'une requête fetch
avec les mêmes arguments à travers plusieurs generateStaticParams
, Layouts et Pages ne sera effectuée qu'une seule fois, ce qui réduit les temps de construction.
Utilisez le guide de migration si vous migrez depuis le répertoire pages
.
Consultez la documentation de la fonction serveur generateStaticParams
pour plus d'informations et des cas d'utilisation avancés.
Segments attrape-tout
Les segments dynamiques peuvent être étendus pour attraper les segments suivants en ajoutant des points de suspension dans les crochets [...nomDuDossier]
.
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 : [[...nomDuDossier]]
.
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 les optionnels, la route sans le paramètre est également prise en compte (/shop
dans l'exemple ci-dessus).
Route | Exemple d'URL | params |
---|---|---|
app/shop/[[...slug]]/page.js | /shop | {} |
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 de votre segment de route configuré.
export default function Page({ params }: { params: { slug: string } }) {
return <h1>Ma Page</h1>
}
export default function Page({ params }) {
return <h1>Ma Page</h1>
}
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 } |
Bon à savoir : Cela pourra être fait automatiquement par le plugin TypeScript à l'avenir.