Создайте свой первый островок Astro
Используйте компонент Preact для приветствия ваших посетителей случайно выбранным сообщением!
Приготовьтесь…
- Добавить Preact в ваш проект Astro
- Включить островки Astro (компоненты Preact
.jsx) на вашей домашней странице - Использовать директивы
client:чтобы сделать островки интерактивными
Добавьте Preact в ваш проект Astro
Если сервер разработки работает, остановите его, чтобы получить доступ к терминалу (сочетание клавиш: Ctrl + C).
Добавьте возможность использования компонентов Preact в вашем проекте Astro одной командой:
npx astro add preactpnpm astro add preactyarn astro add preactСледуйте инструкциям командной строки, чтобы подтвердить добавление Preact в ваш проект.
Включите приветственный баннер Preact
Этот компонент будет принимать массив приветственных сообщений в качестве свойства и случайно выбирать одно из них для отображения в качестве приветствия. Пользователь может нажать кнопку, чтобы получить новое случайное сообщение.
Создайте новый файл в
src/components/под названиемGreeting.jsxОбратите внимание на расширение файла
.jsx. Этот файл будет написан на Preact, а не на Astro.Добавьте следующий код в
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> ); }Импортируйте и используйте этот компонент на вашей домашней странице
index.astro.--- import BaseLayout from '../layouts/BaseLayout.astro'; import Greeting from '../components/Greeting.jsx'; const pageTitle = "Главная"; --- <BaseLayout pageTitle={pageTitle}> <h2>Мой потрясающий подзаголовок блога</h2> <Greeting messages={["Привет", "Здравствуйте", "Приветствую", "Эй, привет"]} /> </BaseLayout>Проверьте предпросмотр в вашем браузере: вы должны увидеть случайное приветствие, но кнопка не будет работать!
Добавьте второй компонент
<Greeting />с директивойclient:load.--- 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:loadговорит Astro отправить и перезапустить свой JavaScript на клиенте, когда страница загружается, делая компонент интерактивным. Мы называем это гидратированным компонентом.Как только разница станет понятна, уберите негидратированный компонент Greeting.
--- 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>Какие из пяти компонентов будут гидратированными островками, отправляющими JavaScript на клиент?
В чём
<PreactBanner />компоненты будут похожи? В чём они будут отличаться?Предположим, компонент
SvelteCounterотображает число и имеет кнопку для его увеличения. Если бы вы не могли видеть код вашего сайта, а только опубликованную страницу, как бы вы определили, какой из двух компонентов<SvelteCounter />используетclient:visible?
Проверьте свои знания
Для каждого из следующих компонентов определите, что будет отправлено в браузер:
<ReactCounter client:load /><SvelteCard />