Хотите заказать веб-сайт? Связаться с нами

Разбираем синтаксис JSX на пальцах

Цель урока: понять, что такое JSX, почему он нужен, и научиться писать живую разметку, которая умеет работать с данными, логикой и состояниями.

Разбираем синтаксис JSX на пальцах

Что такое JSX и зачем он нужен

JSX (JavaScript XML) — это расширение синтаксиса JavaScript, которое позволяет писать HTML-подобный код прямо внутри JavaScript-файлов.

Зачем это нужно?

  1. React разделяет не технологии (HTML/CSS/JS), а компоненты — самодостаточные куски интерфейса.
  2. В одном компоненте удобно хранить и разметку, и логику, и стили.
  3. 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-sizefontSize, background-colorbackgroundColor.

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 из прошлого урока и сделай следующее:

  1. Добавь переменную const name = 'Твое_имя' внутри компонента App
  2. Выведи приветствие: <h1>Привет, {name}!</h1>
  3. Добавь условный рендеринг: если name не пустой — показывать приветствие, иначе — кнопку «Войти»
  4. Добавь стиль: заголовок синего цвета, размер 32px
  5. Всё оберни во Fragment (<>...</>)
  6. Проверка: После сохранения страница должна обновиться и показать твой результат.

Что дальше?

В следующем уроке разберём Компоненты — функциональные и классовые. Ты научишься создавать свои собственные элементы, которые можно переиспользовать как конструктор. Это и есть сердце React.

Теги: