Comenzar a trabajar con componentes en Astro puede parecer complejo, pero es esencial para estructurar mejor nuestro proyecto y reaprovechar código. Al crear componentes, podemos separar las estructuras grandes en piezas más pequeñas y manejables, reutilizándolas en diferentes lugares. En este artículo, veremos cómo descomponer los elementos de un archivo index.astro en componentes y analizaremos cómo se configuran y utilizan.
¿Cómo crear un componente en Astro?
Para mostrar cómo crear un componente en Astro, partiremos de un proyecto con un archivo index.astro donde ya tenemos algunos elementos. Nos enfocaremos en dividir un encabezado y un mensaje en componentes separados.
Creación del componente header: Vamos a empezar creando un archivo llamado header.astro. Este componente tendrá la parte de lógica en TypeScript en la parte superior y el HTML necesario para dar vida al componente.
---// TypeScript logic for propsexportinterfaceProps{title: string;}const{ title }=Astro.props;---<header><h1>{title}</h1></header><style>// Styles for headerh1 {/* Estilo gradiente y otros específicos */}</style>
Separación y adaptación de estilos: Al separar un componente, es necesario trasladar los estilos CSS asociados a él desde el archivo principal index.astro al nuevo componente. Esto asegura que los estilos sean encapsulados y solo se apliquen en el contexto correcto.
¿Qué es un componente presentacional?
A diferencia de los componentes funcionales que pueden incluir lógica de JavaScript, los componentes presentacionales están destinados únicamente a mostrar contenido y aplicar estilos. Un ejemplo sería un componente que solo contiene HTML y CSS. Veamos cómo crear uno:
Creación del componente hero: Este componente no requiere JavaScript. Simplemente copiamos el contenido HTML relevante, trasladamos los estilos y lo configuramos como un componente independiente.
<p><!-- Contenido del componente --></p><style>// Estilos necesarios para p
p{/* Definición específica */}</style>
¿Cómo integrar los componentes en Astro?
Una vez que los componentes están configurados, debemos integrarlos de nuevo en el archivo principal o en los lugares donde queremos reutilizarlos.
Uso del componente en index.astro: Traemos los componentes creados dentro del archivo principal como se muestra a continuación.
---
import Header from './Header.astro';
import Hero from './Hero.astro';
---
<Header title="Bienvenido a Astro" />
<Hero />
Esta integración sencilla es una muestra del poder y la flexibilidad de Astro para gestionar elementos repetitivos o estandarizar partes de nuestra aplicación.
Verificación en el navegador
Al finalizar la implementación de los componentes, es recomendable verificar en el navegador que todo funcione correctamente. Lo hacemos al recargar la página y asegurarnos de que todos los cambios se muestren como se espera, permitiendo interactividad y un diseño consistente.
Con estos pasos, comenzamos a experimentar los beneficios de los componentes en Astro, historias que simplifican el mantenimiento, reducen la repetición de código, y maximizan la reutilización. La creación de componentes personalizados es un gran paso para construir aplicaciones web más dinámicas y bien estructuradas. ¡Continúa practicando y descubre más funciones dentro de Astro para enriquecer tus proyectos!
📝El sistema de maquetado de Astro es muy parecido a Vue o Svelte, y con el tema de los estilos también.
Por ejemplo, los estilos que viven dentro de un componente son por defecto locales, es decir, no afectan a otros componentes de tu sitio. Si bien siempre es recomendable usar estilos locales para la mayoría de los casos, eventualmente puedes encontrar una razón válida para escribir CSS global. Puedes desactivar el CSS con alcance local predeterminado con el atributo <style is:global>.
<style is:global>/* Global, entregada tal como está al navegador.
Se aplica a todas las etiquetas <h2> de tu sitio web. */ h1 {color: red;}</style>
También puedes mezclar reglas de CSS globales y locales en la misma etiqueta <style> usando el selector :global(). Esto se convierte en un patrón poderoso para aplicar estilos CSS a los elementos hijos de tu componente.
<style>/* Con alcance solo a este componente */ h1 {color: red;}/* Mixta: se aplica solo a los elementos `h1` hijos. */article:global(h1){color: blue;}</style><h2>Title</h2><article><slot /></article>
👀RECUERDA ⚠️:
Los estilos locales deben usarse con la mayor frecuencia posible. Los estilos globales deben usarse solo cuando sea necesario.
Al profesor se le olvidó enseñarnos a importar y colocar los componentes de forma manual.
Imports:
import Header from '../components/Header.astro';
import Hero from '../components/Hero.astro';
Components:
<Header title="AstroBuild.tips" />
<Hero />
Gracias, esto me hacía falta poner
Es cierto, pero bueno con la extensión al escribirlo te sugiera el nombre del componente y pinchando la primera vez ya agrega la línea de import, pero sí fuera sido bueno aclarar este detalle de que necesita ser importado.
No se si sea lo más óptimo pero me sirvió para continuar a la siguiente clase. Si alguien tiene una mejor solución me compenta. Gracias de antemano
yo le indique un id para mayor especificidad y me funciono
Intenta quitar el h1 del documento index.astro, ya que este esta separado como componente
La línea "import Hero from '../components/Hero.astro';" no se creó de forma automática en mi archivo index.astro, me ha tocado generarla manualmente
Es posible que la línea de importación no se haya generado automáticamente debido a un error o a una configuración incorrecta. Verifica que el archivo 'Hero.astro' exista en la ubicación '../components/' y que no haya errores en tu proyecto. Si el problema persiste, puedes intentar agregar la línea de importación manualmente en tu archivo index.astro.
Si no pueden visualizar el componente header, recuerden agregar la siguiente linea: De donde tomamos el titulo originalmente
<Header title="AstroBuild.tips"/>
Si sigue sin poder visualizarse es posible que no se importara el componente de manera automatica, pero no pasa nada, vayamos a la parte superior de nuestro index (donde colocamos el js) e importemos el componente con la siguiente linea:
import Header from "../components/Header.astro";
El title lo estaba cogiendo del Layout, para solucionar el problema como dice el compañero hay que importar el Header y colocar su respectiva etiqueta en el main.
La solución se evidencia en el minuto 5:35 🤦♂️
Componentes en Astro
En el desarrollo de aplicaciones web, generalmente adjudicamos a pequeñas piezas interactivas una gran importancia de desarrollo, comúnmente llamadas como componentes.
.
ℹ️ Definición
Un componente es una funcionalidad independiente, cuya función principal radica en la interactividad visual por interfaz de nuestros usuarios o audiencias finales.
.
Cuando desarrollamos una vista de nuestro sitio o aplicación, tenemos que tomar a consideración de 2 aspectos importantes:
Definición de estilos por jerarquía, composición o locales.
Creación de componentes independientes o secciones visuales.
.
Ambos, nos permiten dividir nuestra visión en funcionalidades, interacciones o aspectos visuales para organizar nuestros entregables en desarrollo.
.
Definición de estilos
Al definir estilos, podemos emplear metodologías de construcción basados en reglas como BEM (Bloque-Elementos-Modificar) y/o Atomic Design. Con ello, ganamos versatilidad, visión y escalabilidad para agregar, modificar o mezclar complejidades en desarrollo.
.
Al abstraer nuestros estilos, tenemos la elección de 3 estilos de diseños:
Estilos basados en jerarquía, se refieren a estilos cuya definición están delimitados por las variaciones que tendrá nuestro recurso(s) visual(es).
Estilos basados por composición, se refieren a estilos delimitados por piezas clave, o anatomía, que tendrá nuestro recurso visual.
Estilos locales, se refieren a estilos limitados por el mismo componente con ciertas variaciones como modificadores.
.
Creación de componentes
Recordemos que un componente será una parte fundamental en la navegación o interacción de nuestro producto web. En ocasiones, un componente generará complejidades para su construcción por su implicación en la redacción vs la utilidad.
.
En redacción, un componente será considerado como una sección en la narrativa de nuestro producto, sirviendo de contexto (promociones, realce de vocablos, etc.). Así mismo, un componente en utilidad, implicará una interacción nuclear como CTA (Call-To-Action), sin alterar la narrativa de nuestro producto.
.
Un componente por utilidad, lo podemos agrupar por el nivel de complejidad o dependencia de entradas, significado en su distribución de nuestro proyecto (componentes base y componentes wrappers, por ejemplo).
.
Estructura de Componentes Astro
Un componente de Astro se compone de dos partes principales: una sección de script y la estructura del componente.
Astro usa un delimitador para identificar código (---) . Si alguna vez ha escrito Markdown, es posible que ya esté familiarizado con un concepto similar llamado Frontmatter.
En esta sección, podemos incluir:
Anexo de otros componentes de Astro y de otros Frameworks/librerías de JavaScript.
Obtener contenido de una API o driver para conexión de base de datos.
.
✨ Concepto clave
La sección de script deberá garantizar desarrollo mínimo elemental del componente, porque para mayor desarrollo ser recomienda el uso de otros Frameworks como NextJS para React o NuxtJS para Vue, etc.
.
Para la estructura del componente, Astro nos permite representar de manera directa en HTML. Sin embargo, la sintaxis de la plantilla de componentes de Astro también admite expresiones de JavaScript, etiquetas Astro <style> y <script>, componentes importados y directivas especiales de Astro, etc.
.
✨ Concepto clave
Los datos y valores definidos en el script del componente se pueden usar en la plantilla del componente para producir HTML creado dinámicamente.
.
Desarrollo de Componentes
ⴵ Repositorio: Coffeeroasters
Del sitio documentado en el Figma, podemos decir de manera preliminar el siguiente orden de elementos visuales:
.
.
De manera genérica, podemos asumir que todo es un componente. Sin embargo, en desarrollo esa asunción es equivocada puesto que la diferencia entre un componente y una sección de nuestro sitio es la utilidad o interacción.
.
ℹ️ Definición
Un componente es una funcionalidad independiente, cuya función principal radica en la interactividad visual por interfaz de nuestros usuarios o audiencias finales.
.
Con ello en mente, tendríamos que un componente a partir de nuestro desarrollo serían:
Menu navigation. Del cual. albergará un menú como navegación para asistir en dicha utilidad con el usuario.
Button. Del cual, en este apartado será un CTA (Call-To-Action).
.
✨ Concepto clave
Un componente se puede replicar y utilizar según una jerarquía o composición.
.
Cabe aclarar que nuestro Hero, no es un componente puesto que es en sí mismo una sección narrativa de nuestro sitio y servirá para disponer ciertos titulares según sea la intención del producto web.
.
✨ Concepto clave
Una herramienta se nombra con su contexto para denotar tecnologías, en su lugar simplemente mencionarlas, es decir, Tailwind CSS se refiere que dicha herramienta es para estilos de CSS; así como ReactJS.
.
Para trabajar con componentes en Tailwind, tenemos 3 opciones para desarrollarlos: locales, utilidades en línea o en plugins. Cada método presentará o armonizará con alguna regla que se acuerde durante desarrollo.
.
En mi caso, presento a los desarrollo de estilos en local cuando el componente no presenta una variación o jerarquía de estilos, segú nuestro sistema de diseño.
.
Por ejemplo:
.
.
De aquí,mencionamos que, por BEM, tendríamos un componente con 1 modificador, por lo que:
button sería nuestro diseño base o por default
button--disabled sería nuestro modificador dado por atributo disabled
.
En el caso del hover, no se suele desarrollar como un modificador sino como un adicionable a nuestro componente base y seguido por sus diferentes variaciones.
.
./src/components/Button.astro
.
Al hablar de componentes por composición, tenemos nuestro Menu Navigation, el cual estará conformado por Items Navigation, los cuales serán cruciales para la navegación del sitio.
.
De aquí mencionamos, que por BEM, tendríamos un componente que contiene a otro componente. Sin embargo, no presenta una complejidad para manterlo en separado de este mismo, es decir, no posee un estado.
.
✨ Concepto clave
Un estado es una característica independizada por los componentes web, dichos estados poseen vínculos dependientes según sea la regla de negocio o de diseño que se le requiera.
.
./src/components/MenuNavigation.astro
<navclass='menu-navigation'><aclass='menu-navigation__item--active'href='#'>Home</a><aclass='menu-navigation__item'href='#'>About us</a><aclass='menu-navigation__item'href='#'>Create your plan</a></nav>
Para su orden futura en nuestro tema de diseño, nuestros componentes tendrán sus estilos como componentes para emplear la herramienta PostCSS de Tailwind.
.
./src/styles/components/header.cjs
Finalmente, nuestro Hero, como se mencionó, será una sección que poseerá un CTA como Button. Significando en una jerarquía con BEM, de la siguiente forma:
---import Default from '@layouts/default.astro'
import MenuNavigation from '@components/MenuNavigation.astro'
import Button from '@components/Button.astro'---<Default><header><imgsrc='/images/logo.svg'alt='Coffeeroasters Logo'/><MenuNavigation/></header><main><sectionclass='hero bg-image-hero'><h1class='hero__title'>Great coffee made simple.</h2><pclass='hero__description'>Start your mornings with the world's best coffees. Try our expertly curated artisan coffees from our best roasters delivered directly to your door, at your schedule.</p><Buttontext='Create your plan'/></section></main></Default>