Правила JSX

Собираем чек-лист правил JSX, чтобы перестать ловить ошибки «Adjacent JSX elements» и «class is not a valid attribute».

Правила JSX — небольшой набор отличий от HTML, которые вытекают из того, что JSX компилируется в JavaScript.

1. Один корневой элемент

Функция-компонент возвращает один элемент. Нельзя вернуть два соседних тега — это всё равно что в JavaScript написать return a b;. Обернём в общий контейнер:

// ❌ Ошибка: два корневых элемента
function Bad() {
  return (
    <h1>Заголовок</h1>
    <p>Текст</p>
  );
}

// ✅ Один корень
function Good() {
  return (
    <div>
      <h1>Заголовок</h1>
      <p>Текст</p>
    </div>
  );
}

2. Фрагмент, чтобы не плодить div

Лишний <div> иногда мешает вёрстке. Чтобы вернуть несколько элементов без обёртки, используют фрагмент — пустые теги <>...</>:

function Good() {
  return (
    <>
      <h1>Заголовок</h1>
      <p>Текст</p>
    </>
  );
}

Фрагмент группирует элементы, но сам не создаёт узла в DOM.

3. className вместо class

Слово class зарезервировано в JavaScript, поэтому в JSX CSS-класс задаётся через className. Аналогично for у <label> становится htmlFor:

<label className="field" htmlFor="email">Почта</label>
<input id="email" />

4. Закрывайте все теги

В HTML можно писать <br> или <img> без закрытия. В JSX любой тег обязан быть закрыт — одиночные через слеш в конце:

<img src="cat.png" alt="кот" />
<input type="text" />
<br />

5. camelCase для атрибутов и обработчиков

Атрибуты из нескольких слов пишутся в camelCase: onclickonClick, tabindextabIndex, maxlengthmaxLength. Значения-выражения передаются в фигурных скобках:

<button onClick={handleClick} tabIndex={0}>
  Кнопка
</button>

6. Инлайн-стиль — это объект

Атрибут style принимает не строку, а объект, где свойства в camelCase. Обратите внимание на двойные фигурные скобки: внешние — «вход в JS», внутренние — сам объект:

<p style={{ color: "red", fontSize: "20px" }}>Важно</p>

Памятка отличий

HTMLJSX
class="box"className="box"
for="id"htmlFor="id"
onclick="..."onClick={fn}
<br><br />
style="color:red"style={{ color: "red" }}

Итог

  • Компонент возвращает один корневой элемент; несколько — оборачивайте в <div> или фрагмент <>...</>.
  • classclassName, forhtmlFor, атрибуты в camelCase, все теги закрыты.
  • style принимает объект, поэтому пишется в двойных фигурных скобках.
Проверьте себя
1. Почему компонент не может вернуть два соседних тега без обёртки?
AЭто запрещено правилами HTML
BJSX компилируется в JavaScript, а функция возвращает одно значение
CБраузер не умеет показывать два элемента
DReact ограничивает размер компонента
2. Как в JSX задать CSS-класс элементу?
AАтрибутом class, как в HTML
BАтрибутом className
CАтрибутом cssClass
DЧерез тег <style>
3. Что нужно использовать, чтобы вернуть несколько элементов без лишнего div в DOM?
AТег <span>
BФрагмент <>...</>
CМассив строк
DАтрибут multiple
4. Как правильно задать инлайн-стиль в JSX?
Astyle="color: red"
Bstyle={color: red}
Cstyle={{ color: "red" }}
Dcss={{ color: "red" }}
Поддержать проект