JSX — это синтаксический сахар для создания элементов в Preact,
который позволяет писать код, похожий на HTML, внутри JavaScript. Одной
из ключевых особенностей JSX является возможность использования
выражений JavaScript внутри фигурных скобок
{}.
Любое корректное выражение JavaScript может быть помещено внутрь JSX. Это могут быть:
Пример использования переменной:
import { h } from 'preact';
const name = 'Preact';
const element = <h1>Привет, {name}!</h1>;
В данном случае {name} подставит значение переменной
name в DOM.
JSX позволяет выполнять операции прямо внутри фигурных скобок:
const a = 5;
const b = 10;
const element = <p>{a} + {b} = {a + b}</p>;
Здесь результат выражения {a + b} вычисляется на этапе
рендеринга.
Условные конструкции в JSX реализуются через тернарный оператор,
поскольку обычный if нельзя использовать внутри фигурных
скобок:
const isLoggedIn = true;
const element = <div>{isLoggedIn ? 'Добро пожаловать' : 'Пожалуйста, войдите'}</div>;
Тернарный оператор позволяет менять содержимое элементов динамически в зависимости от состояния приложения.
Для условного отображения элементов часто применяются логические выражения:
const notifications = 3;
const element = <div>{notifications > 0 && <span>У вас {notifications} новых уведомлений</span>}</div>;
Выражение
notifications > 0 && <span>...</span>
рендерит <span> только если условие истинно.
JSX поддерживает вызовы функций внутри фигурных скобок, что позволяет динамически формировать контент:
function formatName(user) {
return `${user.firstName} ${user.lastName}`;
}
const user = { firstName: 'Иван', lastName: 'Иванов' };
const element = <h1>Привет, {formatName(user)}!</h1>;
Функция formatName вызывается при рендеринге, а
возвращаемое значение вставляется в DOM.
Выражения можно комбинировать и вкладывать друг в друга:
const a = 5;
const b = 10;
const showSum = true;
const element = (
<div>
{showSum ? <p>{a} + {b} = {a + b}</p> : <p>Сумма скрыта</p>}
</div>
);
Такая конструкция позволяет строить сложные логические структуры прямо внутри JSX без необходимости писать отдельные функции рендера.
null, undefined и false не
рендерятся в DOM.const items = ['Яблоко', 'Банан', 'Вишня'];
const element = (
<ul>
{items.map(item => <li>{item}</li>)}
</ul>
);
При использовании массивов элементов для динамического рендеринга
необходимо задавать атрибут key для каждого элемента:
const items = ['Яблоко', 'Банан', 'Вишня'];
const element = (
<ul>
{items.map((item, index) => <li key={index}>{item}</li>)}
</ul>
);
key помогает Preact эффективно обновлять DOM,
минимизируя количество изменений.
Выражения можно использовать не только внутри содержимого элементов, но и в их атрибутах:
const size = 50;
const element = <img src="logo.png" width={size} height={size} />;
Все значения, передаваемые через фигурные скобки, вычисляются как JavaScript выражения, что делает атрибуты динамическими.
Для комбинирования строк с динамическими значениями используют как обычную конкатенацию, так и шаблонные строки:
const user = 'Иван';
const element = <p>Привет, {user + '!'}</p>;
const element2 = <p>{`Привет, ${user}!`}</p>;
Оба подхода полностью эквивалентны и выбираются по удобству в конкретной ситуации.
Выражения в JSX являются основным инструментом для динамического формирования интерфейса в Preact. Правильное понимание их работы позволяет создавать гибкие и лаконичные компоненты без лишнего кода.