CodeAventura
Astro
▸Componentes y composición▸Layouts: estructura compartida

Misión

●iniciando…
Astro
Preparando entorno

Esto solo ocurre la primera vez que abres el curso.

08 / 22Layouts: estructura compartida
Anterior

Layouts: estructura compartida

El HTML repetido

Si has escrito ya tres páginas, te habrás fijado: cada .astro empieza igual:

Repetir esto en cada página es un dolor (y una fuente de bugs: cuando cambias el <header>, tienes que tocar 20 archivos).

Un layout es solo un componente con un slot

Astro no tiene una API especial para layouts. Un layout es un componente normal que define la envoltura HTML y deja un <slot /> en el medio para que las páginas inyecten su contenido.

Por convención los guardas en src/layouts/, pero técnicamente podrían vivir en cualquier sitio.

Usar un layout en una página

Importa el layout y envuelve el contenido específico de esa página:

Si abres el HTML resultante, el <header> y <footer> están ahí gratis. Cambias el layout una vez y se actualizan todas las páginas que lo usan.

Layouts con props

Los layouts son componentes, así que también aceptan props. Lo más típico es pasarles el title de la página:

Y al usarlo:

(Lo profundizaremos en la lección de SEO.)

Layouts anidados

Nada te impide tener un layout que use otro layout. Por ejemplo: un BlogLayout que envuelve los posts y, a su vez, está envuelto por BaseLayout. Los slots se encadenan de forma natural.

Tu desafío 🚀

Tienes dos archivos:

  1. src/layouts/BaseLayout.astro (vacío)
  2. src/pages/index.astro (con contenido suelto, sin layout aún)

En BaseLayout.astro:

  • Mantén la estructura HTML completa (<html>, <head>, <body>).
  • Dentro del <body>, añade un <header> con el nombre del sitio, un <slot /> y un <footer> con un copyright.

En index.astro:

  • Importa BaseLayout desde ../layouts/BaseLayout.astro.
  • Envuelve el <h1> y el <p> con <BaseLayout>...</BaseLayout>.
  • Quita el <html>, <head> y <body> que pudiera haber: ya los aporta el layout.

Cuando lo tengas, mete unos minutos jugando: cambia el <header> y verás cómo se actualizan todas las páginas a la vez.