Newsletter para devsEntra
Aprende Astro framework

Layouts y Props

Usando los layouts o “plantillas de página”

👀 Alerta, código duplicado

Si te has dado cuenta index.astro y about.astro son casi iguales. Una de las malas prácticas en programación es duplicar código.

🌎 Dicen los que saben que “El mejor código es el que no se escribe”.

Como queremos hacer las cosas bien desde el principio nos vamos a meter en otro de los brillantes conceptos de Astro: los layouts.

🔍 Un layout (o “plantilla de página”) es como una plantilla contenedor que nos permite meter dentro páginas de Astro.

Crea la carpeta src/layouts.

Crea dentro el fichero SiteLayout.astro.

Copia y pega este código allí:

src/layouts/SiteLayout.astro
Copy

_21
---
_21
---
_21
_21
<html lang="en">
_21
<head>
_21
<meta charset="utf-8" />
_21
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
_21
<meta name="viewport" content="width=device-width" />
_21
<meta name="generator" content={Astro.generator} />
_21
<link
_21
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
_21
rel="stylesheet"
_21
integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD"
_21
crossorigin="anonymous"
_21
/>
_21
<title>Soy Astro</title>
_21
</head>
_21
<body>
_21
<slot />
_21
</body>
_21
</html>

👀 Fíjate que hemos extraído las partes comunes de nuestras dos páginas a este nuevo layout y hemos incorporado la etiqueta <slot /> propia de Astro. Ahí aparecerá luego nuestro contenido.

Avanzamos un poco más.

Modifica src/pages/index.astro y déjalo así:

src/pages/index.astro
Copy

_32
---
_32
import SiteLayout from "../layouts/SiteLayout.astro";
_32
---
_32
_32
<SiteLayout>
_32
<div class="container col-xxl-8 px-4 py-5">
_32
<div class="row flex-lg-row-reverse align-items-center g-5 py-5">
_32
<div class="col-10 col-sm-8 col-lg-6">
_32
<img
_32
src="https://placekitten.com/g/500/400"
_32
class="d-block mx-lg-auto img-fluid"
_32
alt="Flamante Astro web"
_32
width="700"
_32
height="500"
_32
loading="lazy"
_32
/>
_32
</div>
_32
<div class="col-lg-6">
_32
<h1 class="display-5 fw-bold lh-1 mb-3">Mi primera Astro web</h1>
_32
<p class="lead">
_32
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
_32
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
_32
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
_32
aliquip ex ea commodo consequat.
_32
</p>
_32
<div class="d-grid gap-2 d-md-flex justify-content-md-start">
_32
<a href="/about" class="btn btn-primary btn-lg px-4 me-md-2">Leer más</a>
_32
</div>
_32
</div>
_32
</div>
_32
</div>
_32
</SiteLayout>

Aquí han pasado dos cosas importantes

  1. Hemos utilizado la parte del “script” (la parte que hay entre las líneas --- para importar el layout que has creado. ¡Eso es JavaScript!
  2. Cambiamos el código repetido para incluirlo dentro de las etiquetas <SiteLayout>. ¡Eso es HTML!

¿Te acuerdas de lo que te dije antes de los layouts?

Un layout es un “contenedor”, una plantilla donde “metemos dentro” páginas.

💪 ¡Pues acabas de conseguirlo!

💦 Repite el mismo proceso para la página de about.astro

🔍 ¿Ves lo que está pasando?

Nuestra etiqueta <title> se repite tanto en la home como en /about.

Podemos resolverlo muy fácil, ya verás:

Props

🔍 Las props son propiedades que podemos pasar de un sitio a otro en los componentes de Astro. Realmente SiteLayout.astro es un “componente”, aunque con algunas características especiales.

Cada componente de Astro tiene dos partes bien diferenciadas como ya has visto antes:


_10
---
_10
// Script del componente (JavaScript)
_10
---
_10
<!-- HTML del componente -->

Ahora queremos que cada page pueda indicarle al layout un title diferente.

Para eso usaremos el objeto Astro , disponible en todos los componentes del proyecto.

src/layouts/SiteLayout.astro
Copy

_22
---
_22
const {title} = Astro.props
_22
---
_22
_22
<html lang="en">
_22
<head>
_22
<meta charset="utf-8" />
_22
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
_22
<meta name="viewport" content="width=device-width" />
_22
<meta name="generator" content={Astro.generator} />
_22
<link
_22
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
_22
rel="stylesheet"
_22
integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD"
_22
crossorigin="anonymous"
_22
/>
_22
<title>{title}</title>
_22
</head>
_22
<body>
_22
<slot />
_22
</body>
_22
</html>

Astro.props va a ser capaz de leer el atributo title cuando se lo pase una página.

Aplica los cambios a los siguientes ficheros:

src/pages/about.astro
Copy

_10
<SiteLayout title="Sobre mi">

Repite en index.astro

src/pages/index.astro
Copy

_10
<SiteLayout title="Soy Astro">

💪 ¡Visita las páginas y lo tienes hecho!

⚡️ Pon a prueba lo que has aprendido

1. ¿Qué es un layout en Astro?
2. ¿Cómo se pueden pasar propiedades de un componente a otro en Astro?
3. ¿Cuál es el propósito de la etiqueta <slot /> en un layout de Astro?

Este contenido llega a ti gracias a la Comunidad de suscriptores de Web Reactiva