Componentes de otros frameworks
Crea tu página web en Astro sin sacrificar tus componentes de framework favoritos.
Astro es compatible con una variedad de frameworks populares, incluyendo React, Preact, Svelte, Vue, SolidJS, AlpineJS y Lit.
Instalando integraciones
Astro incluye integraciones opcionales de React, Preact, Svelte, Vue, SolidJS, AlpineJS y Lit. Una o varias de estas integraciones de Astro se pueden instalar y configurar en tu proyecto.
De forma predeterminada, los componentes de framework se renderizarán en el servidor, como HTML estático. Esto es útil para crear maquetados que no son interactivos y evitar enviar código JavaScript innecesario al cliente.
Usando componente de framework
¡Usa los componentes de tu framework JavaScript en tus páginas de Astro, diseños y componentes al igual que los componentes de Astro! Todos sus componentes pueden vivir juntos en /src/components
, o pueden organizarse de la manera que desee.
Para usar un componente de framework, importalo desde su ruta relativa en el script de tu componente Astro. Luego, usa el componente junto con otros componentes, elementos HTML y expresiones JSX-like en la plantilla del componente.
Por defecto, tus componentes de framework solo se renderizarán en el servidor, como HTML estático. Esto es útil para crear componentes de maquetado que no son interactivos y evitar enviar código JavaScript innecesario al cliente.
Hidratando componentes interactivos
Un componente de framework puede hacerse interactivo (hidratado) usando una de las directivas client:*
. Estos son atributos del componente que derminan cuando tu componente de JavaScript debería ser enviado al navegador.
Con todas las directivas de cliente excepto client:only
, tu componente se renderizará primero en el servidor para generar el HTML estático. El código JavaScript se mandará al navegador de acuerdo con la directiva que hayas escogido. De esta forma el componente se hidratará y se volverá interactivo.
El framework de JavaScript (React, Svelte, etc.) necesario para renderizar el componente será enviado al navegador junto con el código JavaScript del componente. Si dos o más componentes en una página usan el mismo framework, el framework solo se mandará una vez.
La mayoría de los patrones de accesibilidad específicos de cada framework deberían funcionar cuando estos componentes se usan en Astro. ¡Asegúrate de elegir una directiva de cliente que asegure que cualquier JavaScript relacionado con la accesibilidad se cargue y ejecute correctamente en el momento adecuado!
Directivas de hidratación disponibles
Hay varias directivas de hidratación disponibles para los componentes de framework: client:load
, client:idle
, client:visible
, client:media={QUERY}
y client:only={FRAMEWORK}
.
📚 Consulta nuestra página de referencia de directivas para obtener una descripción completa de las directivas de hidratación y sus usos.
Mezclando frameworks
Puedes importar y renderizar componentes usando múltiples frameworks en el mismo componente de Astro.
Solo los componentes de Astro (.astro
) pueden contener componentes de múltiples frameworks.
Pasando props al componente de framework
Puedes pasar props desde componentes de Astro a tus componentes de framework:
Puedes pasar una función como prop a un componente de framework, pero este solo funcionará al renderizar el componente en el servidor. Si intentas usar la función en un componente hidratado (por ejemplo, como un evento), se producirá un error.
Esto es porque las funciones no pueden ser serializadas (transferidas desde el servidor al cliente) por Astro.
Pasando children a componentes de framework
Dentro de un componente de Astro, puedes pasar elementos children a los componentes del framework. Cada framework tiene sus propios patrones sobre cómo hacer referencia a estos elementos children: React, Preact y Solid usan una prop especial llamada children
, mientras que Svelte y Vue usan el elemento <slot />
.
Además, puedes usar slots con nombre para agrupar hijos específicos.
Para React, Preact y Solid, estos slots se convertirán en una prop de nivel superior. Los slots con nombres que usen kebab-case
se convertirán a camelCase
.
Para Svelte y Vue, puedes hacer referencia a estos slots mediante un elemento <slot>
con el atributo name
. Se conservarán los nombres de los slots que usen kebab-case
.
Anidando componentes de framework
Dentro de un archivo Astro, los children de los componentes de framework también pueden ser componentes hidratados. Esto significa que puedes anidar recursivamente componentes en cualquiera de estos frameworks.
Recuerda: los propios archivos de los componentes de framework (por ejemplo, .jsx
, .svelte
) no pueden combinar varios frameworks.
Esto te permite crear “aplicaciones” completas usando tu framework de JavaScript preferido y renderizarlas, a través de un componente principal, en una página de Astro.
Los componentes de Astro siempre se renderizan a HTML estático, incluso cuando incluyen componentes de framework que son hidratados. Esto significa que solo se pueden pasar props que no hacen ninguna renderización a HTML. Pasar “render props” de React a componentes del framework desde un componente de Astro no funcionará, porque los componentes de Astro no pueden proporcionar el renderizado que este patrón requiere. En su lugar, utiliza slots con nombre.
¿Puedo usar componentes de Astro dentro de mis componentes de framework?
Cualquier componente de framework se convierte en una “isla” de ese framework. Estos componentes deben escribirse en su totalidad como código válido para ese framework, utilizando solo sus propios imports y paquetes. No puedes importar componentes .astro
en un componente de framework (por ejemplo, .jsx
o .svelte
).
Sin embargo, puedes usar el patrón Astro <slot />
para pasar el contenido estático generado por los componentes de Astro como elementos secundarios a los componentes de framework dentro de un Componente .astro
.
¿Puedo hidratar los componentes de Astro?
Si intentas hidratar un componente Astro con un modificador client:
, obtendrás un error.
Los componentes de Astro son componentes de maquetado únicamente en HTML sin ninguna ejecución del lado del cliente. Pero puedes usar una etiqueta <script>
en el maquetado del componente de Astro para enviar JavaScript al navegador que se ejecutará en un ámbito global.
📚 Obtenga más información sobre <scripts>
del lado del cliente en los componentes de Astro