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>
}
Ruta | URL de ejemplo | 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' } |
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.
Ruta | URL de ejemplo | 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'] } |
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).
Ruta | URL de ejemplo | 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
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>
}
Ruta | Definició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.
Grupos de rutas (Route Groups)
Los grupos de rutas pueden usarse para dividir su aplicación Next.js en diferentes secciones.
Interfaz de carga y transmisión en flujo (Streaming)
Basado en Suspense, la interfaz de carga permite crear un respaldo para segmentos de ruta específicos y transmitir contenido automáticamente a medida que esté listo.