layout.js
El archivo layout
se utiliza para definir un diseño en tu aplicación Next.js.
Un diseño raíz (root layout) es el diseño de nivel superior en el directorio raíz app
. Se utiliza para definir las etiquetas <html>
y <body>
y otros elementos de interfaz de usuario compartidos globalmente.
Referencia
Props
children
(requerido)
Los componentes de diseño deben aceptar y utilizar una prop children
. Durante el renderizado, children
se completará con los segmentos de ruta que el diseño está envolviendo. Estos serán principalmente el componente de un Layout hijo (si existe) o Page, pero también podrían ser otros archivos especiales como Loading o Error cuando corresponda.
params
(opcional)
Una promesa que se resuelve en un objeto que contiene los parámetros de ruta dinámica desde el segmento raíz hasta ese diseño.
Ruta de ejemplo | URL | params |
---|---|---|
app/dashboard/[team]/layout.js | /dashboard/1 | Promise<{ team: '1' }> |
app/shop/[tag]/[item]/layout.js | /shop/1/2 | Promise<{ tag: '1', item: '2' }> |
app/blog/[...slug]/layout.js | /blog/1/2 | Promise<{ slug: ['1', '2'] }> |
- Dado que la prop
params
es una promesa, debes usarasync/await
o la funciónuse
de React para acceder a los valores.- En la versión 14 y anteriores,
params
era una prop síncrona. Para mantener la compatibilidad con versiones anteriores, aún puedes acceder a ella de forma síncrona en Next.js 15, pero este comportamiento quedará obsoleto en el futuro.
- En la versión 14 y anteriores,
Diseño raíz (Root Layout)
El directorio app
debe incluir un app/layout.js
raíz.
- El diseño raíz debe definir las etiquetas
<html>
y<body>
.- No debes agregar manualmente etiquetas
<head>
como<title>
y<meta>
en los diseños raíz. En su lugar, debes usar la API de Metadata que maneja automáticamente requisitos avanzados como streaming y desduplicación de elementos<head>
.
- No debes agregar manualmente etiquetas
- Puedes usar grupos de rutas (route groups) para crear múltiples diseños raíz.
- Navegar entre múltiples diseños raíz causará una recarga completa de página (en lugar de una navegación del lado del cliente). Por ejemplo, navegar desde
/cart
que usaapp/(shop)/layout.js
a/blog
que usaapp/(marketing)/layout.js
causará una recarga completa de página. Esto solo aplica para múltiples diseños raíz.
- Navegar entre múltiples diseños raíz causará una recarga completa de página (en lugar de una navegación del lado del cliente). Por ejemplo, navegar desde
Consideraciones
Objeto Request
Los diseños se almacenan en caché en el cliente durante la navegación para evitar solicitudes innecesarias al servidor.
Los diseños no se vuelven a renderizar. Pueden almacenarse en caché y reutilizarse para evitar cálculos innecesarios al navegar entre páginas. Al restringir el acceso al objeto request crudo en los diseños, Next.js puede evitar la ejecución de código de usuario potencialmente lento o costoso dentro del diseño, lo que podría afectar negativamente el rendimiento.
Para acceder al objeto request, puedes usar las APIs headers
y cookies
en Componentes del Servidor (Server Components) y Funciones.
Parámetros de consulta (Query params)
Los diseños no se vuelven a renderizar en la navegación, por lo que no pueden acceder a los parámetros de búsqueda que de otro modo quedarían obsoletos.
Para acceder a los parámetros de consulta actualizados, puedes usar la prop searchParams
de la Página, o leerlos dentro de un Componente del Cliente usando el hook useSearchParams
. Dado que los Componentes del Cliente se vuelven a renderizar durante la navegación, tienen acceso a los últimos parámetros de consulta.
Pathname
Los diseños no se vuelven a renderizar en la navegación, por lo que no acceden al pathname que de otro modo quedaría obsoleto.
Para acceder al pathname actual, puedes leerlo dentro de un Componente del Cliente usando el hook usePathname
. Dado que los Componentes del Cliente se vuelven a renderizar durante la navegación, tienen acceso al último pathname.
Obtención de datos (Fetching Data)
Los diseños no pueden pasar datos a sus children
. Sin embargo, puedes obtener los mismos datos en una ruta más de una vez y usar cache
de React para desduplicar las solicitudes sin afectar el rendimiento.
Alternativamente, al usar fetch
en Next.js, las solicitudes se desduplican automáticamente.
Acceso a segmentos hijos
Los diseños no tienen acceso a los segmentos de ruta por debajo de sí mismos. Para acceder a todos los segmentos de ruta, puedes usar useSelectedLayoutSegment
o useSelectedLayoutSegments
en un Componente del Cliente.
Ejemplos
Metadata
Puedes modificar los elementos HTML <head>
como title
y meta
usando el objeto metadata
o la función generateMetadata
.
Nota importante: No debes agregar manualmente etiquetas
<head>
como<title>
y<meta>
en los diseños raíz. En su lugar, usa las APIs de Metadata que manejan automáticamente requisitos avanzados como streaming y desduplicación de elementos<head>
.
Enlaces de navegación activos
Puedes usar el hook usePathname
para determinar si un enlace de navegación está activo.
Dado que usePathname
es un hook del cliente, necesitas extraer los enlaces de navegación en un Componente del Cliente, que puede importarse en tu diseño:
Mostrar contenido basado en params
Utilizando segmentos de ruta dinámicos, puede mostrar o recuperar contenido específico basado en la propiedad params
.
Leer params
en Componentes del Cliente (Client Components)
Para usar params
en un Componente del Cliente (que no puede ser async
), puede utilizar la función use
de React para leer la promesa:
Historial de Versiones
Versión | Cambios |
---|---|
v15.0.0-RC | params ahora es una promesa. Hay disponible un codemod. |
v13.0.0 | Se introdujo layout . |