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