Skip to content

04. Componentes en Astro

4.1 Creación de componentes reutilizables

Section titled “4.1 Creación de componentes reutilizables”

Los componentes son bloques de código independientes y reutilizables que encapsulan estructura, estilo y lógica.

  • Evitar duplicación de código (DRY)
  • Facilitar mantenimiento y actualizaciones
  • Mejorar organización del proyecto
  • Permitir composición de interfaces
  • Aumentar productividad del desarrollo

Carpeta src/components/

  • Todos los componentes reutilizables
  • Extensión .astro para componentes Astro
  • También .jsx, .vue, .svelte para otros frameworks
  • Nombres en PascalCase (ej: Button.astro)

Tres secciones:

1. Frontmatter (---)

  • Lógica del servidor
  • Importaciones
  • Props y variables
  • Fetch de datos

2. Template

  • Marcado HTML
  • Uso de props
  • Expresiones JavaScript

3. Estilos (opcional)

  • CSS scoped por defecto
  • Específico del componente
  • No afecta otros componentes

Scoped Styles

  • CSS aislado automáticamente
  • No hay conflictos de nombres
  • Mejor encapsulación

Zero JavaScript

  • Componentes estáticos por defecto
  • HTML puro en el output
  • JavaScript solo si se especifica

Type Safety

  • TypeScript integrado
  • Interfaces para props
  • Validación en desarrollo
  • Un propósito: Cada componente hace una cosa bien
  • Nombres descriptivos: Claros y específicos
  • Props tipadas: Usar TypeScript
  • Documentación: Comentar props complejas
  • Composición: Componentes pequeños y combinables
TipoDescripciónEjemplo
UIElementos visualesButton, Card, Modal
LayoutEstructura de páginaHeader, Footer, Sidebar
ContenedorEnvuelven otros componentesContainer, Grid
FuncionalLógica sin UIDataFetcher

Props y slots son los mecanismos principales para pasar datos y contenido a los componentes.

Propósito:

  • Pasar datos del padre al hijo
  • Configurar comportamiento del componente
  • Personalizar apariencia
  • Comunicación unidireccional

Características:

  • Acceso via Astro.props
  • Inmutables (solo lectura)
  • Type-safe con TypeScript
  • Valores por defecto

Tipos de Props:

  • Primitivos: string, number, boolean
  • Objetos: Datos estructurados
  • Arrays: Listas de elementos
  • Funciones: Callbacks (limitado)

Propósito:

  • Pasar contenido HTML/componentes
  • Crear componentes contenedores
  • Permitir composición flexible
  • Plantillas reutilizables

Tipos de Slots:

1. Slot Default

  • <slot /> sin nombre
  • Recibe todo el contenido hijo
  • Más común y simple

2. Slots Nombrados

  • <slot name="nombre" />
  • Múltiples áreas de contenido
  • Mayor control de layout

3. Slot Fallback

  • Contenido por defecto
  • Se muestra si no hay contenido
  • Útil para opcionales
AspectoPropsSlots
TipoDatosContenido HTML
UsoConfiguraciónComposición
CantidadMúltiplesMúltiples (nombrados)
TipadoTypeScriptNo tipado

Props:

  • Definir interfaces TypeScript
  • Valores por defecto razonables
  • Validación de tipos
  • Nombres descriptivos

Slots:

  • Usar slots nombrados para claridad
  • Proporcionar fallbacks
  • Documentar slots disponibles
  • Mantener simplicidad

4.3 Interactividad y eventos en componentes

Section titled “4.3 Interactividad y eventos en componentes”

Los componentes Astro son estáticos por defecto, pero pueden volverse interactivos usando frameworks o scripts del cliente.

1. Scripts del Cliente

  • Tag <script> en componentes
  • JavaScript vanilla
  • Se ejecuta en el navegador
  • Ideal para interacciones simples

2. Frameworks UI

  • React, Vue, Svelte
  • Directivas client:*
  • Componentes complejos
  • Estado reactivo

Características:

  • Se ejecutan en el navegador
  • Pueden acceder al DOM
  • Event listeners
  • Manipulación de elementos

Tipos de Scripts:

1. Script Inline

  • Dentro del componente
  • Scoped al componente
  • Procesado por Astro

2. Script Hoisted

  • <script is:inline>
  • No procesado
  • JavaScript puro

3. Script Module

  • <script type="module">
  • Imports ES6
  • Mejor para código complejo

Para componentes de frameworks:

DirectivaCuándoUso
client:loadInmediatoCrítico
client:idleNavegador inactivoSecundario
client:visibleVisible en viewportBelow-fold
client:onlySolo clienteAPIs navegador
  • Progresive Enhancement: Funciona sin JS
  • Mínimo JavaScript: Solo lo necesario
  • Event Delegation: Eficiencia en eventos
  • Accesibilidad: Teclado y screen readers
  • Performance: Lazy loading cuando posible
  • Componentes Astro no tienen estado reactivo
  • No hay lifecycle hooks
  • Para reactividad compleja, usar frameworks
  • Scripts se ejecutan después del render
🐝