Перейти к содержимому

Справочник выражений в шаблонах

Синтаксис компонентов Astro является надмножеством HTML. Он разработан так, чтобы быть знакомым всем, кто работал с HTML или JSX, и добавляет поддержку компонентов и JavaScript-выражений.

Вы можете определять локальные переменные JavaScript внутри скрипта компонента (блок метаданных между ---) и вставлять их в HTML-шаблон с помощью фигурных скобок!

Локальные переменные вставляются в HTML с помощью синтаксиса фигурных скобок:

src/components/Variables.astro
---
const name = "Astro";
---
<div>
<h1>Привет, {name}!</h1> <!-- Вывод: <h1>Привет, Astro!</h1> -->
</div>

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

src/components/DynamicAttributes.astro
---
const name = "Astro";
---
<h1 class={name}>Поддержка выражений в атрибутах</h1>
<MyComponent name={`МоёИмя${name}`} />

Вы можете использовать стандартные функции JavaScript (например, .map()) для генерации списков элементов:

---
const items = ["Собака", "Кот", "Утконос"];
---
<ul>
{items.map((item) => (
<li>{item}</li>
))}
</ul>

Astro поддерживает условный рендеринг через логические операторы и тернарные выражения:

---
const visible = true;
---
{visible && <p>Я виден!</p>}
{visible ? <p>Да</p> : <p>Нет</p>}

Вы можете использовать переменные в качестве имен тегов. Имя переменной обязательно должно начинаться с большой буквы:

---
import MyComponent from "./MyComponent.astro";
const Element = 'div';
const Component = MyComponent;
---
<Element>Привет!</Element> <!-- отрендерится как <div>Привет!</div> -->
<Component /> <!-- отрендерится как <MyComponent /> -->

Astro поддерживает синтаксис <> </> и встроенный компонент <Fragment />. Это полезно, когда нужно сгруппировать элементы без добавления лишнего <div> в итоговый HTML.

---
const htmlString = '<p>Сырой HTML контент</p>';
---
<Fragment set:html={htmlString} />

Содержит функции для работы с дочерними элементами (слотами).

Проверяет, передан ли контент в конкретный слот. Полезно для условного рендеринга оберток.

{Astro.slots.has('more') && (
<aside>
<slot name="more" />
</aside>
)}

Позволяет асинхронно отрендерить содержимое слота в строку HTML.

---
const html = await Astro.slots.render('default');
---
<Fragment set:html={html} />

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

---
const { items } = Astro.props;
---
<ul>
{items.map((item) => (
<li>
{Array.isArray(item) ? <Astro.self items={item} /> : item}
</li>
))}
</ul>