Компоненты
Компоненты Astro являются основными строительными блоками любого проекта Astro. Они представляют собой HTML шаблоны, которые не требуют выполнения на стороне клиента. Определить компонент Astro можно по расширению файла: .astro
.
Компоненты Astro чрезвычайно гибки. Часто компонент Astro будет содержать некоторый повторно используемый UI на странице, например заголовок или карточку профиля. В других случаях компонент Astro может содержать небольшой фрагмент HTML, например набор общих <meta>
тегов, которые упрощают работу с SEO. Компоненты Astro могут даже содержать макет страницы целиком.
Самое главное, что нужно знать о компонентах Astro, - это то, что они не отрисовываются на клиенте. Они преобразуются в HTML либо во время сборки, либо с использованием рендеринга на стороне сервера (SSR) (EN). Вы можете включить JavaScript-код внутри вашего компонента frontmatter, и он весь будет удален с конечной страницы, отправленной в браузеры ваших пользователей. В результате получается более быстрый сайт с нулевым использованием JavaScript по умолчанию.
Когда вашему компоненту Astro действительно требуется интерактивность на стороне клиента, вы можете добавить стандартные теги HTML <script>
или компоненты UI фреймворков (EN).
Структура компонента
Заголовок раздела Структура компонентаКомпонент Astro состоит из двух основных частей: Скрипта компонента и Шаблона компонента. Каждая часть выполняет свою работу, но вместе они обеспечивают структуру, которая одновременно проста в использовании и достаточно выразительна, чтобы справиться с тем, что вы захотите создать.
Скрипт компонента
Заголовок раздела Скрипт компонентаAstro использует ограждение кода (---
) для идентификации скрипта в вашем компоненте Astro. Если вы когда-либо писали Markdown раньше, возможно, вы уже знакомы с похожей концепцией, называемой frontmatter. Идея Astro о скрипте компонента была непосредственно вдохновлена этой концепцией.
Вы можете использовать скрипт компонента для написания любого кода JavaScript, необходимого для визуализации шаблона. Это может включать в себя:
- импорт других Astro компонентов
- импорт компонентов из других фреймворков, таких как React
- импорт данных, например файла JSON
- получение контента из API или базы данных
- создание переменных, на которые вы будете ссылаться в своем шаблоне
Ограждение кода предназначено для того, чтобы гарантировать, что JavaScript, который вы пишете в нем, не ускользнет в ваше внешнее приложение и не попадет в руки вашего пользователя. Вы можете безопасно писать здесь ресурсоёмкий или конфиденциальный код (например, вызов вашей личной базы данных), не беспокоясь о том, что он когда-либо попадет в браузер вашего пользователя.
Вы даже можете использовать TypeScript в скрипте вашего компонента!
Шаблон компонента
Заголовок раздела Шаблон компонентаШаблон компонента находится под ограждением кода и определяет вывод HTML вашего компонента.
Если вы напишете здесь простой HTML, ваш компонент будет отображать этот HTML на любой странице Astro, в которую он импортирован и используется.
Однако, синтаксис Astro так же поддерживает JavaScript выражения, Astro <style>
(EN) и <script>
теги, импортированные компоненты, и специальные Astro директивы (EN). Данные и значения, определенные в скрипте компонента, можно использовать в шаблоне компонента для создания динамически создаваемого HTML.
Компонентный дизайн
Заголовок раздела Компонентный дизайнКомпоненты спроектированы так, чтобы их можно было повторно использовать и компоновать. Вы можете использовать компоненты внутри других компонентов для создания более продвинутого пользовательского интерфейса. Например, компонент Button
можно использовать для создания компонента ButtonGroup
:
Входные параметры компонента
Заголовок раздела Входные параметры компонентаКомпонент Astro может определять и принимать параметры. Эти входные параметры затем становятся доступными для шаблона компонента для рендеринга HTML. Входные параметры доступны в глобальном объекте Astro.props
в вашем скрипте.
Вот пример компонента, который получает входные параметры greeting
и name
. Обратите внимание, что получаемые входные параметры деструктурированы из глобального объекта Astro.props
.
Этот компонент при импорте и визуализации в других компонентах Astro, макетах или страницах может передавать эти параметры в качестве атрибутов:
Вы также можете определить свои входные параметры с помощью TypeScript с интерфейсом типа Props
. Astro автоматически подхватит интерфейс Props
в вашем frontmatter и выдаст предупреждения/ошибки типа. Этим входным параметрам также могут быть присвоены значения по умолчанию при деструктуризации из Astro.props
.
Свойствам компонента могут быть присвоены значения по умолчанию, которые можно использовать, если они не указаны.
<slot />
это заполнитель для внешнего HTML-содержимого, позволяющий вставлять дочерние элементы из других файлов в шаблон компонента.
По умолчанию все дочерние элементы, переданные компоненту, будут отображаться в его <slot />
В отличие от входных параметров, которые являются атрибутами, передаваемыми компоненту Astro, доступными для использования во всем вашем компоненте с помощью Astro.props
, слоты отображают дочерние элементы HTML там, где они написаны.
Этот шаблон является основой Astro Макетов: целая страница HTML-контента может быть «обернута» тегами <SomeLayoutComponent></SomeLayoutComponent>
и передана компоненту для отрисовки внутри определенных в нем общих элементов страницы.
Именованые слоты
Заголовок раздела Именованые слотыКомпонент Astro также может иметь именованные слоты. Это позволяет передавать в местоположение слота только элементы HTML с соответствующим именем слота.
Слоты именуются с помощью атрибута name
:
Чтобы внедрить HTML-контент в определенный слот, используйте атрибут slot
в любом дочернем элементе, чтобы указать имя слота. Все остальные дочерние элементы компонента будут вставлены в стандартный (безымянный) <slot />
.
Используйте атрибут slot="my-slot"
в дочернем элементе, который вы хотите передать в соответствующий заполнитель <slot name="my-slot" />
в вашем компоненте.
Чтобы передать несколько HTML-элементов в заполнитель <slot/>
компонента без обёртывающего <div>
, используйте атрибут slot=""
на компоненте <Fragment/>
Astro:
Вставьте несколько строк и столбцов HTML-контента с помощью атрибута slot=""
, чтобы указать содержимое "header"
и "body"
. Отдельные элементы HTML также можно стилизовать:
Обратите внимание, что именованные слоты должны быть непосредственными дочерними элементами компонента. Вы не можете передавать именованные слоты через вложенные элементы.
Именованные слоты также можно передавать в компоненты UI фреймворков (EN)!
Имя астро-слота не может быть сгенерировано динамически, например, в функции map. Если такая возможность необходима в компонентах UI фреймворка, то, возможно, лучше генерировать эти динамические слоты в самом фреймворке.
Резервный контент для слотов
Заголовок раздела Резервный контент для слотовСлоты также могут отображать резервный контент. Когда в слот не передаются соответствующие дочерние элементы, элемент <slot />
отобразит свои собственные дочерние элементы-заполнители.
Перенос слотов
Заголовок раздела Перенос слотовСлоты можно передавать другим компонентам. Например, при создании вложенных макетов:
Именованные слоты могут быть переданы другому компоненту, используя атрибуты name
и slot
в теге <slot />
Теперь содержимое стандартного(безымянного) слота и слота head
, переданных в HomeLayout
, будет перенесено в родительский компонент BaseLayout
.
HTML-компоненты
Заголовок раздела HTML-компонентыAstro поддерживает импорт и использование .html
файлов в качестве компонентов или размещение этих файлов в подкаталоге src/pages/
в качестве страниц. Возможно, вам захочется использовать HTML-компоненты, если вы повторно используете код с существующего сайта, созданного без фреймворка, или если вы хотите убедиться, что ваш компонент не имеет динамических функций.
HTML-компоненты должны содержать только валидный HTML, поэтому они лишены ключевых возможностей компонентов Astro:
- Они не поддерживают frontmatter, импорт на стороне сервера или динамические выражения.
- Любые теги
<script>
остаются неупакованными, и обрабатываются, как если бы у них был атрибутis:inline
. - Они могут только ссылаться на ресурсы, которые находятся в папке
public/
.
В HTML-компоненте элемент <slot />
будет работать так же, как и в компоненте Astro. Чтобы использовать элемент HTML Web Component Slot, добавьте атрибут is:inline
к вашему элементу <slot>
.