Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Пропсы

Пропсы (props, от properties — свойства) — данные, которые компонент получает снаружи, через атрибуты тега. Благодаря им один компонент карточки статьи может показать любую статью: заголовок и дату ему передаёт страница.

Приём пропсов

Внутри компонента пропсы лежат в объекте Astro.props. Создайте src/components/PostCard.astro:

---
const { title, url } = Astro.props;
---
 
<article>
  <h2><a href={url}>{title}</a></h2>
</article>

Компонент берёт из Astro.props два значения деструктуризацией и выводит ссылку с заголовком статьи.

Передача пропсов

Значения передают атрибутами, как в HTML. Откройте src/pages/posts/index.astro (создайте его, если файла ещё нет):

---
import PostCard from '../../components/PostCard.astro';
---
 
<h1>Статьи</h1>
<PostCard title="Первая статья" url="/posts/first-post" />
<PostCard title="Как я учу Astro" url="/posts/learning-astro" />

Откройте http://localhost:4321/posts — появятся две карточки со ссылками. Строки передают в кавычках, а всё остальное — числа, массивы, объекты, переменные — в фигурных скобках: count={3}, tags={['astro', 'css']}.

Тип пропсов

Если описать во фронтматтере интерфейс Props, редактор будет подсказывать имена и проверять типы. Обновите src/components/PostCard.astro:

---
interface Props {
  title: string;
  url: string;
  date?: Date;
}
 
const { title, url, date } = Astro.props;
---
 
<article>
  <h2><a href={url}>{title}</a></h2>
  {date && <time datetime={date.toISOString()}>{date.toLocaleDateString('ru-RU')}</time>}
</article>

Знак вопроса делает пропс date необязательным. Если забыть передать title, редактор подчеркнёт тег, а команда npx astro check выведет ошибку в терминале.

Значения по умолчанию

Значение по умолчанию задают прямо в деструктуризации:

---
interface Props {
  title: string;
  url: string;
  label?: string;
}
 
const { title, url, label = 'Читать' } = Astro.props;
---
 
<article>
  <h2>{title}</h2>
  <a href={url}>{label}</a>
</article>

Карточка без атрибута label покажет ссылку «Читать», а label="Подробнее" заменит текст.

Частая ошибка

Число передают в кавычках: count="3". Компонент получает строку "3", и выражение count + 1 даёт "31" вместо 4. Всё, что не является строкой, передавайте в фигурных скобках: count={3}.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.