JSX (JavaScript XML) — это расширение синтаксиса JavaScript, позволяющее описывать структуру пользовательского интерфейса в виде декларативного кода, напоминающего HTML. Он не является обязательной частью JavaScript, но используется в React для удобного создания компонентов.
JSX позволяет писать компоненты как функции или классы, возвращающие разметку. Несмотря на визуальное сходство с HTML, JSX имеет свои особенности:
const element = <h1>Привет, мир!</h1>;
При компиляции JSX преобразуется в вызовы
React.createElement, которые создают виртуальные
DOM-элементы.
В JSX можно использовать любые выражения JavaScript,
заключая их в фигурные скобки {}:
const name = "Алексей";
const element = <h1>Привет, {name}!</h1>;
Сюда входят арифметические операции, вызовы функций, тернарные операторы и другие выражения:
const isLoggedIn = true;
const element = <div>{isLoggedIn ? "Вы вошли" : "Гость"}</div>;
Важно: нельзя использовать инструкции
(if, for) напрямую внутри фигурных скобок; для
условного рендеринга применяются тернарные операторы или вспомогательные
функции.
Атрибуты в JSX напоминают HTML, но с некоторыми отличиями:
const element = <input type="text" maxLength={10} />;
const size = 30;
const element = <div style={{ width: size + "px" }}>Контент</div>;
const element = <input disabled />;
JSX не использует class для CSS-классов. Вместо этого
применяется атрибут className:
const element = <div className="container">Контент</div>;
Для inline-стилей применяется объект style, где свойства
пишутся в camelCase:
const style = { backgroundColor: "blue", fontSize: "16px" };
const element = <div style={style}>Текст синим цветом</div>;
JSX поддерживает вложенные элементы, что позволяет строить сложные интерфейсы:
const element = (
<div>
<h1>Заголовок</h1>
<p>Абзац текста</p>
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
</ul>
</div>
);
Каждый вложенный элемент должен быть закрыт, включая одиночные теги
(<img />, <input />,
<br />).
Чтобы избежать лишних DOM-узлов, JSX поддерживает
фрагменты. Они позволяют возвращать несколько элементов
без оборачивания в <div>:
const element = (
<>
<h1>Заголовок</h1>
<p>Абзац</p>
</>
);
Фрагменты могут быть пустыми <>...</> или с
явным тегом <React.Fragment>.
JSX позволяет рендерить списки элементов через метод
map:
const numbers = [1, 2, 3];
const listItems = numbers.map((num) => <li key={num}>{num}</li>);
const element = <ul>{listItems}</ul>;
Ключевой момент: каждому элементу списка нужно
назначать уникальный key, чтобы React корректно обновлял
виртуальный DOM.
Для условного отображения элементов применяются тернарные операторы
или логическое И &&:
const isAdmin = true;
const element = (
<div>
{isAdmin && <button>Удалить</button>}
{!isAdmin ? <p>Нет доступа</p> : <p>Доступ разрешен</p>}
</div>
);
Комментарии внутри JSX пишутся особым образом:
const element = (
<div>
{/* Это комментарий */}
<p>Текст</p>
</div>
);
Обычные JavaScript-комментарии // или /* */
работают только вне JSX-блока.
JSX автоматически экранирует значения выражений, предотвращая XSS-атаки:
const userInput = "<script>alert('hi')</script>";
const element = <div>{userInput}</div>; // Безопасно: скрипт не выполнится
Для вставки необработанного HTML используется атрибут
dangerouslySetInnerHTML, но его применение требует
осторожности.
className вместо class и
htmlFor вместо for.{}.style с camelCase
свойствами.JSX нельзя использовать напрямую в браузере. Инструменты вроде
Babel преобразуют JSX в
React.createElement:
const element = <h1>Привет</h1>;
// Превращается в:
const element = React.createElement("h1", null, "Привет");
Такой подход обеспечивает совместимость с обычным JavaScript и виртуальным DOM React.
JSX представляет собой мощный инструмент для создания динамических интерфейсов, объединяя декларативный синтаксис разметки с выразительной силой JavaScript. Он позволяет легко структурировать компоненты, управлять состоянием и создавать сложные UI без громоздких манипуляций с DOM.