generateStaticParams
La fonction generateStaticParams
peut être utilisée en combinaison avec les segments de route dynamiques pour générer statiquement les routes au moment de la construction plutôt qu'à la demande lors de la requête.
// Retourne une liste de `params` pour remplir le segment dynamique [slug]
export async function generateStaticParams() {
const posts = await fetch('https://.../posts').then((res) => res.json())
return posts.map((post) => ({
slug: post.slug,
}))
}
// Plusieurs versions de cette page seront générées statiquement
// en utilisant les `params` retournés par `generateStaticParams`
export default function Page({ params }) {
const { slug } = params
// ...
}
Bon à savoir
- Vous pouvez utiliser l'option de configuration de segment
dynamicParams
pour contrôler ce qui se passe lorsqu'un segment dynamique non généré pargenerateStaticParams
est visité.- Pendant
next dev
,generateStaticParams
sera appelé lorsque vous naviguez vers une route.- Pendant
next build
,generateStaticParams
s'exécute avant la génération des Layouts ou Pages correspondants.- Pendant la revalidation (ISR),
generateStaticParams
ne sera pas rappelé.generateStaticParams
remplace la fonctiongetStaticPaths
dans le Routeur Pages.
Paramètres
options.params
(optionnel)
Si plusieurs segments dynamiques dans une route utilisent generateStaticParams
, la fonction enfant generateStaticParams
est exécutée une fois pour chaque ensemble de params
généré par le parent.
L'objet params
contient les params
remplis par le generateStaticParams
parent, qui peuvent être utilisés pour générer les params
dans un segment enfant.
Retours
generateStaticParams
doit retourner un tableau d'objets où chaque objet représente les segments dynamiques remplis d'une seule route.
- Chaque propriété de l'objet est un segment dynamique à remplir pour la route.
- Le nom de la propriété est le nom du segment, et la valeur de la propriété est ce avec quoi le segment doit être rempli.
Exemple de Route | Type de retour de generateStaticParams |
---|---|
/product/[id] | { id: string }[] |
/products/[category]/[product] | { category: string, product: string }[] |
/products/[...slug] | { slug: string[] }[] |
Segment dynamique unique
export function generateStaticParams() {
return [{ id: '1' }, { id: '2' }, { id: '3' }]
}
// Trois versions de cette page seront générées statiquement
// en utilisant les `params` retournés par `generateStaticParams`
// - /product/1
// - /product/2
// - /product/3
export default function Page({ params }: { params: { id: string } }) {
const { id } = params
// ...
}
export function generateStaticParams() {
return [{ id: '1' }, { id: '2' }, { id: '3' }]
}
// Trois versions de cette page seront générées statiquement
// en utilisant les `params` retournés par `generateStaticParams`
// - /product/1
// - /product/2
// - /product/3
export default function Page({ params }) {
const { id } = params
// ...
}
Segments dynamiques multiples
export function generateStaticParams() {
return [
{ category: 'a', product: '1' },
{ category: 'b', product: '2' },
{ category: 'c', product: '3' },
]
}
// Trois versions de cette page seront générées statiquement
// en utilisant les `params` retournés par `generateStaticParams`
// - /products/a/1
// - /products/b/2
// - /products/c/3
export default function Page({
params,
}: {
params: { category: string; product: string }
}) {
const { category, product } = params
// ...
}
export function generateStaticParams() {
return [
{ category: 'a', product: '1' },
{ category: 'b', product: '2' },
{ category: 'c', product: '3' },
]
}
// Trois versions de cette page seront générées statiquement
// en utilisant les `params` retournés par `generateStaticParams`
// - /products/a/1
// - /products/b/2
// - /products/c/3
export default function Page({ params }) {
const { category, product } = params
// ...
}
Segment dynamique catch-all
export function generateStaticParams() {
return [{ slug: ['a', '1'] }, { slug: ['b', '2'] }, { slug: ['c', '3'] }]
}
// Trois versions de cette page seront générées statiquement
// en utilisant les `params` retournés par `generateStaticParams`
// - /product/a/1
// - /product/b/2
// - /product/c/3
export default function Page({ params }: { params: { slug: string[] } }) {
const { slug } = params
// ...
}
export function generateStaticParams() {
return [{ slug: ['a', '1'] }, { slug: ['b', '2'] }, { slug: ['c', '3'] }]
}
// Trois versions de cette page seront générées statiquement
// en utilisant les `params` retournés par `generateStaticParams`
// - /product/a/1
// - /product/b/2
// - /product/c/3
export default function Page({ params }) {
const { slug } = params
// ...
}
Exemples
Segments dynamiques multiples dans une route
Vous pouvez générer des params pour les segments dynamiques situés au-dessus du layout ou de la page actuelle, mais pas en dessous. Par exemple, pour la route app/products/[category]/[product]
:
app/products/[category]/[product]/page.js
peut générer des params pour à la fois[category]
et[product]
.app/products/[category]/layout.js
peut seulement générer des params pour[category]
.
Il existe deux approches pour générer des params pour une route avec plusieurs segments dynamiques :
Générer les params de bas en haut
Générer plusieurs segments dynamiques à partir du segment de route enfant.
// Générer des segments pour [category] et [product]
export async function generateStaticParams() {
const products = await fetch('https://.../products').then((res) => res.json())
return products.map((product) => ({
category: product.category.slug,
product: product.id,
}))
}
export default function Page({
params,
}: {
params: { category: string; product: string }
}) {
// ...
}
// Générer des segments pour [category] et [product]
export async function generateStaticParams() {
const products = await fetch('https://.../products').then((res) => res.json())
return products.map((product) => ({
category: product.category.slug,
product: product.id,
}))
}
export default function Page({ params }) {
// ...
}
Générer les params de haut en bas
Générer d'abord les segments parents et utiliser le résultat pour générer les segments enfants.
// Générer des segments pour [category]
export async function generateStaticParams() {
const products = await fetch('https://.../products').then((res) => res.json())
return products.map((product) => ({
category: product.category.slug,
}))
}
export default function Layout({ params }: { params: { category: string } }) {
// ...
}
// Générer des segments pour [category]
export async function generateStaticParams() {
const products = await fetch('https://.../products').then((res) => res.json())
return products.map((product) => ({
category: product.category.slug,
}))
}
export default function Layout({ params }) {
// ...
}
La fonction generateStaticParams
d'un segment de route enfant est exécutée une fois pour chaque segment généré par un parent generateStaticParams
.
La fonction generateStaticParams
enfant peut utiliser les params
retournés par la fonction generateStaticParams
parent pour générer dynamiquement ses propres segments.
// Générer des segments pour [product] en utilisant les `params` passés
// depuis la fonction `generateStaticParams` du segment parent
export async function generateStaticParams({
params: { category },
}: {
params: { category: string }
}) {
const products = await fetch(
`https://.../products?category=${category}`
).then((res) => res.json())
return products.map((product) => ({
product: product.id,
}))
}
export default function Page({
params,
}: {
params: { category: string; product: string }
}) {
// ...
}
// Générer des segments pour [product] en utilisant les `params` passés
// depuis la fonction `generateStaticParams` du segment parent
export async function generateStaticParams({ params: { category } }) {
const products = await fetch(
`https://.../products?category=${category}`
).then((res) => res.json())
return products.map((product) => ({
product: product.id,
}))
}
export default function Page({ params }) {
// ...
}
Bon à savoir : Les requêtes
fetch
sont automatiquement mémoïsées pour les mêmes données entregenerateMetadata
,generateStaticParams
, Layouts, Pages et Server Components. Reactcache
peut être utilisé sifetch
n'est pas disponible.
Historique des versions
Version | Changements |
---|---|
v13.0.0 | generateStaticParams introduite. |