Разбираем синтаксис JSX на пальцах
Содержание
- Что такое JSX и зачем он нужен
- Как работает JSX под капотом
- Базовые правила JSX
- Один корневой элемент — почему?
- Атрибуты в JSX (отличия от HTML)
- Вставка JavaScript в JSX (фигурные скобки)
- Условный рендеринг (первое знакомство)
- Стили в JSX (inline-стили)
- JSX и безопасность (XSS-защита)
- Частые ошибки новичков
- Что мы узнали
- Задание для закрепления (на 5 минут)
- Что дальше?
Цель урока: понять, что такое JSX, почему он нужен, и научиться писать живую разметку, которая умеет работать с данными, логикой и состояниями.
Что такое JSX и зачем он нужен
JSX (JavaScript XML) — это расширение синтаксиса JavaScript, которое позволяет писать HTML-подобный код прямо внутри JavaScript-файлов.
Зачем это нужно?
- React разделяет не технологии (HTML/CSS/JS), а компоненты — самодостаточные куски интерфейса.
- В одном компоненте удобно хранить и разметку, и логику, и стили.
- JSX превращает HTML-подобный код в вызовы React-функций.
Главная мысль: JSX — это не шаблонизатор, а синтаксический сахар над React.createElement().
Без JSX мы писали бы так:
React.createElement('h1', null, 'Привет, мир!')
С JSX мы пишем так:
<h1>Привет, мир!</h1>
Разница очевидна — JSX читается как обычный HTML.
Как работает JSX под капотом
Когда ты пишешь JSX сборщик Vite превращает его в обычный JavaScript:
Что ты пишешь:
const element = <h1 className="title">Hello!</h1>
Во что это превращается:
const element = React.createElement('h1', { className: 'title' }, 'Hello!')
Что возвращает React.createElement:
{
type: 'h1',
props: {
className: 'title',
children: 'Hello!'
}
}
Это React-элемент — простой объект, который React использует для построения DOM-дерева.
Важно: JSX обязательно должен быть обработан (транспилирован) перед тем, как попадёт в браузер.
Базовые правила JSX
| Правило | Пример | Почему |
|---|---|---|
| Обязательно один корневой элемент | <div>...<div> или <>...</> |
React возвращает только один элемент |
| Закрывай все теги | <img />, <input />, <br /> |
В отличие от HTML, все теги должны быть закрыты |
| Атрибуты в camelCase | className, onClick, htmlFor |
Они становятся свойствами JS-объекта |
| Выражения в фигурных скобках | {name}, {2 + 2}, {isActive ? 'Да' : 'Нет'} |
Внутри {} можно писать любой JS-код |
| Комментарии | {/* Это комментарий */} |
Нельзя использовать // или /* */ напрямую |
Один корневой элемент — почему?
React не может вернуть два соседних элемента без обёртки:
❌ Ошибка:
function App() {
return (
<h1>Заголовок</h1>
<p>Текст</p>
)
}
✅ Правильно (обёртка div):
function App() {
return (
<div>
<h1>Заголовок</h1>
<p>Текст</p>
</div>
)
}
✅ Ещё лучше (Fragment):
function App() {
return (
<>
<h1>Заголовок</h1>
<p>Текст</p>
</>
)
}
Fragment не создаёт лишних элементов в DOM — идеально для чистоты разметки.
Оживи свой сайт. Освой JavaScript!
Статичная верстка — это только скелет. Наш онлайн-курс "JavaScript с нуля до профи" даст твоим страницам мышцы и нервы. Научись создавать слайдеры, формы, интерактивные карты и получать данные с сервера.
От теории — к реальным скриптам в твоём портфолио.
Атрибуты в JSX (отличия от HTML)
| HTML | JSX | Причина |
|---|---|---|
class |
className |
class — зарезервированное слово в JS |
for (в label) |
htmlFor |
for — тоже зарезервировано |
tabindex |
tabIndex |
camelCase для всех атрибутов |
onclick |
onClick |
Реакт использует свою систему событий |
style="color: red" |
style={{ color: 'red' }} |
style принимает объект |
Вставка JavaScript в JSX (фигурные скобки)
Внутри {} можно писать любое JavaScript-выражение:
Переменные:
const name = 'Алексей';
return <h1>Привет, {name}!</h1>;
Арифметика:
return <p>{2 + 2}</p>; // 4
Условный оператор:
return <p>{age >= 18 ? 'Взрослый' : 'Ребёнок'}</p>;
Вызов функций:
function formatName(user) {
return user.firstName + ' ' + user.lastName;
}
return <p>{formatName(user)}</p>;
Важно: Нельзя вставлять инструкции (if, for, while) — только выражения.
Условный рендеринг (первое знакомство)
Условный рендеринг в React — это механизм, который позволяет динамически отображать разные компоненты или элементы интерфейса в зависимости от значений переменных, состояния или пропсов, используя стандартные JavaScript-операторы, такие как if, else, тернарный оператор или логическое &&.
В JSX нельзя использовать if внутри разметки, поэтому используют:
Тернарный оператор:
return (
<div>
{isLoggedIn ? <h1>Добро пожаловать!</h1> : <button>Войти</button>}
</div>
)
Логическое && (если условие истинно):
return (
<div>
{unreadMessages.length > 0 && <p>У вас {unreadMessages.length} новых сообщений</p>}
</div>
)
Отдельная функция:
function renderContent() {
if (isLoggedIn) return <h1>Добро пожаловать!</h1>
return <button>Войти</button>
}
return <div>{renderContent()}</div>
Стили в JSX (inline-стили)
В JSX стили пишутся через объект с camelCase-свойствами:
function App() {
const styles = {
color: 'blue',
fontSize: '24px',
backgroundColor: '#f0f0f0',
padding: '20px'
};
return <div style={styles}>Привет, мир!</div>;
}
Или прямо в разметке:
return <div style={{ color: 'blue', fontSize: '24px' }}>Текст</div>;
Важно: font-size → fontSize, background-color → backgroundColor.
JSX и безопасность (XSS-защита)
React автоматически экранирует всё, что вставляется через {}.
Безопасно:
const userInput = '<script>alert("Hack!")</script>';
return <div>{userInput}</div>;
React превратит это в строку, а не выполнит скрипт.
Если нужно вставить HTML (осторожно!):
return <div dangerouslySetInnerHTML={{ __html: userInput }} />;
Используй dangerouslySetInnerHTML только для доверенного контента.
Частые ошибки новичков
| Ошибка | Почему | Исправление |
|---|---|---|
return <h1>Текст</h1><p>Текст</p> |
Нет корневого элемента | Оберни в <div> или <> |
class="title" |
class — зарезервировано |
Используй className |
style="color: red" |
style принимает объект |
Напиши style={{ color: 'red' }} |
{if (x) { ... }} |
В {} нельзя писать инструкции |
Используй тернарный оператор |
<img src={image}> |
Нет закрывающего слеша | Напиши <img src={image} /> |
Что мы узнали
| Что узнали | Как это работает |
|---|---|
| JSX — это синтаксический сахар | Превращается в React.createElement() |
| Один корневой элемент | Используй <div> или <> (Fragment) |
| Атрибуты в camelCase | className, onClick, htmlFor |
Вставка JS через {} |
Любое выражение, но не инструкции |
| Условный рендеринг | Тернарник, &&, отдельная функция |
| Стили как объект | style={{ color: 'red' }} |
| Безопасность | Автоматическое экранирование |
Задание для закрепления (на 5 минут)
Открой src/App.jsx из прошлого урока и сделай следующее:
-
Добавь переменную
const name = 'Твое_имя'внутри компонента App -
Выведи приветствие:
<h1>Привет, {name}!</h1> -
Добавь условный рендеринг: если
nameне пустой — показывать приветствие, иначе — кнопку «Войти» -
Добавь стиль: заголовок синего цвета, размер
32px -
Всё оберни во Fragment (
<>...</>) - Проверка: После сохранения страница должна обновиться и показать твой результат.
Что дальше?
В следующем уроке разберём Компоненты — функциональные и классовые. Ты научишься создавать свои собственные элементы, которые можно переиспользовать как конструктор. Это и есть сердце React.