Rutas dinámicas

Cuando no conoces los nombres exactos de los segmentos con anticipación y deseas crear rutas desde datos dinámicos, puedes usar Segmentos Dinámicos que se completan en tiempo de solicitud o prerrenderizados en tiempo de construcción.

Convención

Un Segmento Dinámico se puede crear envolviendo el nombre de una carpeta entre corchetes: [nombreCarpeta]. Por ejemplo, [id] o [slug].

Los Segmentos Dinámicos se pasan como prop params a las funciones layout, page, route, y generateMetadata.

Ejemplo

Por ejemplo, un blog podría incluir la siguiente ruta app/blog/[slug]/page.js donde [slug] es el Segmento Dinámico para las publicaciones.

export default function Page({ params }: { params: { slug: string } }) {
  return <div>Mi publicación: {params.slug}</div>
}
export default function Page({ params }) {
  return <div>Mi publicación: {params.slug}</div>
}
RutaURL de ejemploparams
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' }

Consulta la página generateStaticParams() para aprender cómo generar los parámetros para el segmento.

Nota importante: Los Segmentos Dinámicos son equivalentes a Rutas Dinámicas en el directorio pages.

Generación de Parámetros Estáticos

La función generateStaticParams puede usarse en combinación con segmentos de ruta dinámicos para generar estáticamente rutas en tiempo de construcción en lugar de bajo demanda en tiempo de solicitud.

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,
  }))
}

El beneficio principal de la función generateStaticParams es su recuperación inteligente de datos. Si el contenido se obtiene dentro de la función generateStaticParams usando una solicitud fetch, las solicitudes se memoizan automáticamente. Esto significa que una solicitud fetch con los mismos argumentos en múltiples generateStaticParams, Layouts y Pages solo se hará una vez, lo que reduce los tiempos de construcción.

Usa la guía de migración si estás migrando desde el directorio pages.

Consulta la documentación de la función de servidor generateStaticParams para más información y casos de uso avanzados.

Segmentos comodín

Los Segmentos Dinámicos pueden extenderse para capturar todos los segmentos subsiguientes agregando puntos suspensivos dentro de los corchetes [...nombreCarpeta].

Por ejemplo, app/shop/[...slug]/page.js coincidirá con /shop/clothes, pero también con /shop/clothes/tops, /shop/clothes/tops/t-shirts, y así sucesivamente.

RutaURL de ejemploparams
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'] }

Segmentos comodín opcionales

Los Segmentos comodín pueden hacerse opcionales incluyendo el parámetro en dobles corchetes: [[...nombreCarpeta]].

Por ejemplo, app/shop/[[...slug]]/page.js también coincidirá con /shop, además de /shop/clothes, /shop/clothes/tops, /shop/clothes/tops/t-shirts.

La diferencia entre los segmentos comodín y comodín opcionales es que con los opcionales, la ruta sin el parámetro también coincide (/shop en el ejemplo anterior).

RutaURL de ejemploparams
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

Cuando uses TypeScript, puedes agregar tipos para params dependiendo de tu segmento de ruta configurado.

export default function Page({ params }: { params: { slug: string } }) {
  return <h1>Mi página</h1>
}
export default function Page({ params }) {
  return <h1>Mi página</h1>
}
RutaDefinición de tipo para params
app/blog/[slug]/page.js{ slug: string }
app/shop/[...slug]/page.js{ slug: string[] }
app/[categoryId]/[itemId]/page.js{ categoryId: string, itemId: string }

Nota importante: Esto puede hacerse automáticamente en el futuro por el plugin de TypeScript.