Construye tu primer layout
Prepárate para…
- Refactoriza elementos comunes en un layout de página
- Usa un elemento
<slot />de Astro para colocar contenidos de página dentro de un layout - Pasa valores específicos de página como props a su layout
Aún tienes algunos componentes de Astro repetidamente renderizados en cada página. ¡Es hora de refactorizar de nuevo para crear un layout de página compartido!
Crea tu primer componente de layout
Sección titulada “Crea tu primer componente de layout”-
Crea un nuevo archivo en la ubicación
src/layouts/BaseLayout.astro. (Necesitarás crear una nueva carpetalayoutsprimero.) -
Copia el contenido completo de
index.astroen tu nuevo archivo,BaseLayout.astro.src/layouts/BaseLayout.astro ---import Header from '../components/Header.astro';import Footer from '../components/Footer.astro';import '../styles/global.css';const pageTitle = "Home Page";---<html lang="en"><head><meta charset="utf-8" /><link rel="icon" type="image/svg+xml" href="/favicon.svg" /><meta name="viewport" content="width=device-width" /><meta name="generator" content={Astro.generator} /><title>{pageTitle}</title></head><body><Header /><h1>{pageTitle}</h1><Footer /><script>import "../scripts/menu.js";</script></body></html>
Usa tu layout en una página
Sección titulada “Usa tu layout en una página”-
Reemplaza el código en
src/pages/index.astrocon lo siguiente:src/pages/index.astro ---import BaseLayout from '../layouts/BaseLayout.astro';const pageTitle = "Home Page";---<BaseLayout><h2>My awesome blog subtitle</h2></BaseLayout> -
Revisa la vista previa del navegador de nuevo para notar qué cambió (o, spoiler: ¡no cambió!).
-
Añade un elemento
<slot />asrc/layouts/BaseLayout.astrojusto encima del componente footer, luego revisa la vista previa del navegador de tu página Home y nota qué sí cambió esta vez.src/layouts/BaseLayout.astro ---import Header from '../components/Header.astro';import Footer from '../components/Footer.astro';import '../styles/global.css';const pageTitle = "Home Page";---<html lang="en"><head><meta charset="utf-8" /><link rel="icon" type="image/svg+xml" href="/favicon.svg" /><meta name="viewport" content="width=device-width" /><meta name="generator" content={Astro.generator} /><title>{pageTitle}</title></head><body><Header /><h1>{pageTitle}</h1><slot /><Footer /><script>import "../scripts/menu.js";</script></body></html>
El <slot /> te permite inyectar (o "slot in") contenido hijo escrito entre las etiquetas de apertura y cierre <Component></Component> a cualquier archivo Component.astro.
Pasa valores específicos de página como props
Sección titulada “Pasa valores específicos de página como props”-
Pasa el título de la página a tu componente de layout desde
index.astrousando un atributo de componente:src/pages/index.astro ---import BaseLayout from '../layouts/BaseLayout.astro';const pageTitle = "Home Page";---<BaseLayout pageTitle={pageTitle}><h2>My awesome blog subtitle</h2></BaseLayout> -
Cambia el script de tu componente de layout
BaseLayout.astropara recibir un título de página víaAstro.propsen lugar de definirlo como una constante.src/layouts/BaseLayout.astro ---import Header from '../components/Header.astro';import Footer from '../components/Footer.astro';import '../styles/global.css';const pageTitle = "Home Page";const { pageTitle } = Astro.props;--- -
Revisa la vista previa de tu navegador para verificar que el título de tu página no ha cambiado. Tiene el mismo valor, pero ahora está siendo renderizado dinámicamente. Y ahora, cada página individual puede especificar su propio título al layout.
Pruébalo tú mismo - Usa tu layout en todas partes
Sección titulada “Pruébalo tú mismo - Usa tu layout en todas partes”Refactoriza tus otras páginas (blog.astro y about.astro) para que usen tu nuevo componente <BaseLayout> para renderizar los elementos comunes de la página.
No olvides:
-
Pasar un título de página como props vía un atributo de componente.
-
Dejar que el layout sea responsable de la renderización HTML de cualquier elemento común.
-
Mueve cualquier etiqueta
<style>existente en el<head>de la página con estilos que quieras conservar a la plantilla HTML de la página. -
Elimina cualquier cosa de cada página individual que ahora está siendo manejada por el layout, incluyendo:
- Elementos HTML
- Componentes y sus imports
- Reglas CSS en una etiqueta
<style>(ej.<h1>en tu página About) - Etiquetas
<script>
Usar el <BaseLayout> para renderizar tu página about.astro significa que perderás la etiqueta <style> añadida al <head> de esta página. Para continuar estilizando elementos solo a nivel de página usando el estilizado scoped de Astro, mueve la etiqueta <style> al body del componente de página. Esto te permite estilizar elementos creados en este componente de página (ej. tu lista de habilidades).
Ya que tu <h1> ahora es creado por tu componente de layout, puedes añadir el atributo is:global a tu etiqueta style para afectar a cada elemento en esta página, incluyendo los creados por otros componentes: <style is:global define:vars={{ skillColor, fontWeight, textCase }}>
Pon a prueba tu conocimiento
Sección titulada “Pon a prueba tu conocimiento”-
Un componente de Astro (archivo
.astro) puede funcionar como: -
Para mostrar un título de página en la página, puedes:
-
La información puede ser pasada de un componente a otro: