Componentes
Los componentes de Astro son los bloques de construcción básicos de cualquier proyecto de Astro. Son componentes de maquetado HTML sin tiempo de ejecución en el lado del cliente. Puedes identificar un componente de Astro por su extensión de archivo: .astro
.
Los componentes de Astro son extremadamente flexibles. Un componente de Astro puede contener UI reutilizable, tal como encabezados o una tarjeta de perfil. También puede contener un fragmento pequeño de HTML, o una colección de etiquetas <meta>
para facilitar nuestro trabajo con el SEO. Los componentes de Astro también pueden contener el layout de una página.
La más importante que debes saber sobre los componentes de Astro es que no se renderizan en el cliente. Se renderizan a HTML ya sea en tiempo de compilación o bajo demanda utilizando renderizado del lado del servidor (SSR). Puedes incluir código JavaScript dentro del frontmatter de tu componente y todo el código será eliminado de la página final enviada a los navegadores de tus usuarios. El resultado es un sitio más rápido, con cero huella de JavaScript agregada por defecto.
Cuando tu componente Astro necesite interactividad del lado del cliente, puedes agregar etiquetas <script>
HTML estándar o componentes de UI Framework.
Estructura de un componente
Sección titulada Estructura de un componenteUn componente de Astro se compone de dos partes principales: el script del componente y el maquetado del componente. Cada parte cumple una función diferente, pero juntas proveen un marco de trabajo más fácil de utilizar y lo suficientemente expresivo para manejar cualquier cosa que desees construir.
Script de un componente
Sección titulada Script de un componenteAstro utiliza una valla de código (---
) para identificar el script del componente Astro. Si has escrito Markdown anteriormente deberías estar familiarizado con un concepto similar llamado frontmatter. El script del componente de Astro fue inspirado por este concepto.
Puedes utilizar el script del componente para escribir cualquier código de JavaScript que necesites para renderizar el maquetado. Esto puede incluir:
- Importar otros componentes Astro
- Importar componentes de otros frameworks, como React
- Importar datos, como un archivo JSON
- Consultar contenido de una API o base de datos
- Crear variables que luego puedes referenciar en tu maquetado
La valla de código está diseñada para garantizar que el código JavaScript que escribes adentro se encuentre “encapsulado”. Este código no se filtrará a tu aplicación, o llegará al usuario final. Puedes escribir código que sea costoso o sensible (como una llamada a la base de datos) sin preocuparte por que estos datos sensibles lleguen al navegador del usuario.
¡Incluso puedes escribir TypeScript en el script del componente!
Maquetado del componente
Sección titulada Maquetado del componenteEl maquetado del componente se encuentra debajo de la valla de código y determina la salida HTML de tu componente.
Si escribes solo HTML en esta sección, el componente va a renderizar este HTML en cualquier página Astro donde sea importado o utilizado.
Sin embargo, el maquetado de componentes de Astro también soporta expresiones de JavaScript, etiquetas <style>
y <script>
de Astro, componentes importados, y directivas especiales de Astro. Los datos y valores definidos en el script del componente pueden ser usados en el maquetado del componente para producir HTML creado dinámicamente.
Diseño basado en componentes
Sección titulada Diseño basado en componentesLos componentes son diseñados para ser reusables y componibles. Puedes usar componentes dentro de otros componentes para construir UI más y más avanzada. Por ejemplo, un componente Button
podría ser usado para crear un componente ButtonGroup
:
Props de componentes
Sección titulada Props de componentesUn componente de Astro puede definir y aceptar props. Estas props estarán disponibles para ser utilizadas en el renderizado del maquetado HTML y además estarán disponibles en el script del componente de manera global dentro del objeto Astro.props
.
Aquí vemos un ejemplo de un componente que recibe una prop saludo
y otra nombre
. Fíjate que las props a recibir están desestructuradas del objeto global Astro.props
.
Este componente, cuando se importa y renderiza en otros componentes, layouts o páginas de Astro, puede pasar estas props como atributos:
También puedes definir props con TypeScript usando una interfaz de tipo Props
. Astro recogerá automáticamente la interfaz Props
en el frontmatter y dará advertencias/errores de tipo para tu proyecto. A estas propiedades también se les puede dar valores predeterminados cuando se desestructuran desde Astro.props
.
A los props de componentes se les pueden dar valores predeterminados para usar cuando no se proporciona ninguno.
El elemento <slot />
es un espacio reservado para contenido HTML externo, permitiéndote inyectar (o ingresar en la “ranura”) elementos hijos provenientes de otros archivos en el maquetado de tu componente.
Por defecto, todos los elementos hijos que le sean enviados a un componente serán renderizados en su <slot />
.
Diferente a props, que son atributos enviados a un componente Astro y disponibles para utilizar con Astro.props
, los slots renderizan elementos HTML hijos donde se lo indique.
Este patrón es la base de un maquetado de componente Astro: todo el contenido HTML de una página puede ser “envuelto” con etiquetas <SomeLayoutComponent></SomeLayoutComponent>
y enviadas al componente para que se renderice dentro de elementos comunes de página definidos allí.
Slots con nombre
Sección titulada Slots con nombreUn componente de Astro también puede tener slots con nombre. Esto te permite compartir elementos HTML únicamente con el nombre correspondiente al slot.
Los slots se nombran usando el atributo name
:
Para inyectar contenido HTML en un slot particular, usa el atributo slot
en cualquier elemento hijo para especificar el nombre del slot. Todos los demás elementos hijos del componente serán inyectados en el slot por defecto (sin nombre) <slot />
.
Utiliza un atributo slot="mi-slot"
en el elemento hijo que quieras enviar junto con su <slot name="mi-slot" />
emparejado en tu componente.
Para pasar múltiples elementos HTML dentro del placeholder <slot/>
de un componente sin un <div>
envolvente, usa el atributo slot=""
en el componente <Fragment/>
de Astro:
Inyecta múltiples filas y columnas de contenido HTML usando el atributo slot=""
para especificar el contenido "header"
y "body"
. Los elementos HTML individuales también pueden ser estilizados:
Ten en cuenta que los slots con nombre deben ser hijos inmediatos del componente. No puedes pasar slots con nombre a través de elementos anidados.
Los slots con nombre también se pueden pasar a componentes de framework en archivos Astro.
La generación dinámica de un nombre de slot de Astro, tal como dentro de una función map, fue añadida en Astro v4.2.0. Para versiones anteriores de Astro, podría ser mejor generar estos slots dinámicos dentro del framework mismo.
Contenido alternativo para slots
Sección titulada Contenido alternativo para slotsLos slots también pueden renderizar contenido alternativo en el caso que no reciban datos con <slot />
para emparejar, sea slot con nombre o no.
Transferir slots
Sección titulada Transferir slotsLos slots pueden ser transferidos a otros componentes. Por ejemplo, cuando se crean plantillas anidadas:
Los slots con nombre pueden ser transferidos a otro componente usando los atributos name
y slot
en una etiqueta <slot />
Ahora, los slots por defecto y head
pasados a HomeLayout
serán transferidos al componente padre BaseLayout
.
Componentes HTML
Sección titulada Componentes HTMLAstro soporta importar y usar archivos .html
como componentes o colocarlos dentro del subdirectorio src/pages/
. Es posible que quieras usar componentes HTML si estás reusando código de un sitio existente construido sin usar frameworks, o si quieres asegurarte que tu componente no tiene características dinámicas.
Los componentes HTML solo deben contener HTML válido, y por lo tanto le faltarán características claves de los componentes de Astro.
- Ellos no soportan el frontmatter, importaciones del lado del servidor, o expresiones dinámicas.
- Cualquier etiqueta
<script>
quedan sin agrupar, son tratados como si tuvieranin:inline
- Ellos solo pueden referenciar recursos que están en la carpeta
public/
.
Un elemento <slot/>
dentro de un componente HTML trabajar como lo haría en un componente de Astro. En cambio, para poder usar el elemento Componente Web HTML Slot añade is:inline
al elemento slot
.