Skip to content

Компоненты

Простыми словами

Компонент — функция, которая один раз собирает свой кусок страницы и отдаёт его. Перерисовок нет: всё живое внутри обновляется через привязанные значения.

Компонент — обычная функция, возвращающая DOM. Она выполняется ровно один раз на каждое появление в дереве — это конструктор живого поддерева, а не функция рендера.

tsx
function Greeting(props: { name: State<string> }) {
  return <p>Привет, {props.name}!</p>;
}

Нет ни инстанса, ни объекта жизненного цикла, ни повторных вызовов. Всё, что компонент настроил — привязки, подписки, таймеры, — живёт до уничтожения его поддерева (см. Владение).

Пропсы

Пропсы читаются один раз, в теле. Конвенция, которая держит компоненты честными:

  • меняется во времени → принимайте State<T>;
  • фиксировано на всю жизнь поддерева → принимайте просто T.
tsx
function Price(props: { amount: State<number>; currency: string }) {
  return (
    <span>
      {props.amount.map((a) => a.toFixed(2))} {props.currency}
    </span>
  );
}

Механизма «пропсы изменились» нет: если родитель хочет менять то, что показывает ребёнок, он передаёт ему State. Деструктурировать пропсы безопасно — это обычные значения.

Дети

children — всё, что JSX туда положил: узлы, строки, States, массивы или функция (render prop), если компоненту так удобнее:

tsx
function Card(props: { title: string; children?: Child }) {
  return (
    <section class="card">
      <h3>{props.title}</h3>
      {props.children}
    </section>
  );
}

Элементы — это значения

JSX немедленно вычисляется в настоящие DOM-узлы. Паттерны, требующие ref в React, здесь тривиальны:

tsx
const input = (<input />) as HTMLInputElement;
onMount(() => input.focus());
return <form>{input}</form>;

Для элементов глубоко в JSX есть ref={fn} / ref={obj} — срабатывает при создании.

Никаких правил

Ничего не перезапускается, поэтому хелперы компонентов — обычные функции. Создавайте состояние в условии, в цикле, на уровне модуля (модульные свёртки вроде accum оборачивайте в root() — состоянию нужен владелец, см. Владение); выносите «кастомные хуки» как функции, возвращающие States/Streams — без правил порядка и линт-плагинов.


Незнакомый термин? Вся терминология этой документации объяснена в глоссарии.