Перейти к содержимому
This is an unmaintained snapshot of the Astro v4 docs. View the latest docs.

Создайте свой первый остров Astro

Используйте компонент Preact для приветствия ваших посетителей случайно выбранным приветственным сообщением!

Приготовьтесь…

  • Добавить Preact в ваш проект Astro
  • Включить острова Astro (компоненты Preact .jsx) на вашей домашней странице
  • Использовать директивы client: чтобы сделать острова интерактивными
  1. Если сервер разработки работает, остановите его, чтобы получить доступ к терминалу (клавиша ярлыка: Ctrl + C).

  2. Добавьте возможность использования компонентов Preact в вашем проекте Astro одной командой:

    Окно терминала
    npx astro add preact
  3. Следуйте инструкциям командной строки, чтобы подтвердить добавление Preact в ваш проект.

Этот компонент будет принимать массив приветственных сообщений в качестве свойства и случайно выбирать одно из них для отображения в качестве приветственного сообщения. Пользователь может нажать кнопку, чтобы получить новое случайное сообщение.

  1. Создайте новый файл в src/components/ под названием Greeting.jsx

    Обратите внимание на расширение файла .jsx. Этот файл будет написан на Preact, а не на Astro.

  2. Добавьте следующий код в 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}! Спасибо за ваш визит!</h3>
    <button onClick={() => setGreeting(randomMessage())}>
    Новое приветствие
    </button>
    </div>
    );
    }
  3. Импортируйте и используйте этот компонент на вашей домашней странице index.astro.

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting.jsx';
    const pageTitle = "Home Page";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>Мой потрясающий подзаголовок блога</h2>
    <Greeting messages={["Привет", "Здравствуйте", "Приветствую", "Эй там"]} />
    </BaseLayout>

    Проверьте предпросмотр в вашем браузере: вы должны увидеть случайное приветствие, но кнопка не будет работать!

  4. Добавьте второй компонент <Greeting /> с директивой client:load.

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Главная страница";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>Мой потрясающий подзаголовок блога</h2>
    <Greeting messages={["Привет", "Здравствуйте", "Приветствую", "Эй, ты"]} />
    <Greeting client:load messages={["Hej", "Hallo", "Hola", "Habari"]} />
    </BaseLayout>
  5. Вернитесь на свою страницу и сравните два компонента. Вторая кнопка работает, потому что директива client:load говорит Astro отправить и перезапустить свой JavaScript на клиенте, когда страница загружается, делая компонент интерактивным. Мы называем это гидратированным компонентом.

  6. Как только разница станет понятна, уберите негидратированный компонент Greeting.

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Главная страница";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>Мой потрясающий подзаголовок блога</h2>
    <Greeting messages={["Привет", "Здравствуйте", "Приветствую", "Эй, ты"]} />
    <Greeting client:load messages={["Hej", "Hallo", "Hola", "Habari"]} />
    </BaseLayout>

Существуют и другие директивы client: для изучения. Каждая из них отправляет JavaScript на клиент в разное время. client:visible, например, отправит JavaScript компонента только тогда, когда он будет виден на странице.

Рассмотрите компонент Astro со следующим кодом:

---
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. Какие из пяти компонентов будут гидратированными островами, отправляя JavaScript на клиент?

  2. В чём <PreactBanner /> компоненты будут похожи? В чём они будут отличаться?

  3. Предположим, что компонент SvelteCounter показывает число и имеет кнопку для его увеличения. Если бы вы не могли видеть код вашего сайта, только опубликованную страницу, как бы вы определили, какой из двух компонентов <SvelteCounter /> использует client:visible?

Для каждого из следующих компонентов определите, что будет отправлено в браузер:

  1. <ReactCounter client:load/>

  2. <SvelteCard />

Внести свой вклад

Что у вас на уме?

Сообщество