Saltar al contenido

Construye tu primera Astro island

Usa un componente de Preact para saludar a tus visitantes con un mensaje de bienvenida seleccionado aleatoriamente.

Prepárate para…

  • Añade Preact a tu proyecto de Astro
  • Incluye Astro islands (componentes Preact .jsx) en tu página principal
  • Usa directivas client: para hacer las islands interactivas
  1. Si está corriendo, detén el dev server para tener acceso a la terminal (atajo de teclado: Ctrl + C).

  2. Añade la capacidad de usar componentes de Preact en tu proyecto de Astro con un solo comando:

    Ventana de la terminal
    npx astro add preact
  3. Sigue las instrucciones de la línea de comandos para confirmar la adición de Preact a tu proyecto.

Este componente tomará un array de mensajes de saludo como prop y seleccionará aleatoriamente uno de ellos para mostrar como mensaje de bienvenida. El usuario puede hacer clic en un botón para obtener un nuevo mensaje aleatorio.

  1. Crea un nuevo archivo en src/components/ llamado Greeting.jsx

    Nota la extensión de archivo .jsx. Este archivo será escrito en Preact, no en Astro.

  2. Añade el siguiente código a Greeting.jsx:

    src/components/Greeting.jsx
    import { useState } from 'preact/hooks';
    export default function Greeting({messages}) {
    const randomMessage = () => messages[(Math.floor(Math.random() * messages.length))];
    const [greeting, setGreeting] = useState(messages[0]);
    return (
    <div>
    <h3>{greeting}! Thank you for visiting!</h3>
    <button onClick={() => setGreeting(randomMessage())}>
    New Greeting
    </button>
    </div>
    );
    }
  3. Importa y usa este componente en tu página Home index.astro.

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Home Page";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>My awesome blog subtitle</h2>
    <Greeting messages={["Hi", "Hello", "Howdy", "Hey there"]} />
    </BaseLayout>

    Revisa la vista previa en tu navegador: deberías ver un saludo aleatorio, ¡pero el botón no funcionará!

  4. Añade un segundo componente <Greeting /> con la directiva client:load.

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Home Page";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>My awesome blog subtitle</h2>
    <Greeting messages={["Hi", "Hello", "Howdy", "Hey there"]} />
    <Greeting client:load messages={["Hej", "Hallo", "Hola", "Habari"]} />
    </BaseLayout>
  5. Revisa tu página de nuevo y compara los dos componentes. El segundo botón funciona porque la directiva client:load le dice a Astro que envíe y reejecute su JavaScript en el cliente cuando la página se carga, haciendo el componente interactivo. Esto se llama un componente hidratado.

  6. Una vez que la diferencia sea clara, elimina el componente Greeting no hidratado.

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Home Page";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>My awesome blog subtitle</h2>
    <Greeting messages={["Hi", "Hello", "Howdy", "Hey there"]} />
    <Greeting client:load messages={["Hej", "Hallo", "Hola", "Habari"]} />
    </BaseLayout>

Hay otras directivas client: para explorar. Cada una envía el JavaScript al cliente en un momento diferente. client:visible, por ejemplo, solo enviará el JavaScript del componente cuando es visible en la página.

Considera un componente de Astro con el siguiente código:

---
import BaseLayout from '../layouts/BaseLayout.astro';
import AstroBanner from '../components/AstroBanner.astro';
import PreactBanner from '../components/PreactBanner';
import SvelteCounter from '../components/SvelteCounter.svelte';
---
<BaseLayout>
<AstroBanner />
<PreactBanner />
<PreactBanner client:load />
<SvelteCounter />
<SvelteCounter client:visible />
</BaseLayout>
  1. ¿Cuáles de los cinco componentes serán islands hidratadas, enviando JavaScript al cliente?

  2. ¿De qué manera(s) serán iguales los dos componentes <PreactBanner />? ¿De qué manera(s) serán diferentes?

  3. Asume que el componente SvelteCounter muestra un número y tiene un botón para incrementarlo. Si no pudieras ver el código de tu sitio web, solo la página publicada en vivo, ¿cómo sabrías cuál de los dos componentes <SvelteCounter /> usó client:visible?

Para cada uno de los siguientes componentes, identifica qué será enviado al navegador:

  1. <ReactCounter client:load />

  2. <SvelteCard />

Contribuir Comunidad Patrocinar