v19.2Latest

Написание разметки с помощью JSX

JSX— это синтаксическое расширение для JavaScript, которое позволяет писать HTML-подобную разметку внутри JavaScript-файла. Хотя существуют и другие способы написания компонентов, большинство React-разработчиков предпочитают лаконичность JSX, и большинство кодовых баз используют его.

Вы узнаете
  • Почему React смешивает разметку с логикой рендеринга
  • Чем JSX отличается от HTML
  • Как отображать информацию с помощью JSX

JSX: Встраивание разметки в JavaScript

Веб был построен на HTML, CSS и JavaScript. Многие годы веб-разработчики хранили контент в HTML, дизайн в CSS, а логику в JavaScript — часто в отдельных файлах! Контент размещался внутри HTML, в то время как логика страницы существовала отдельно в JavaScript:

HTML-разметка с фиолетовым фоном и div с двумя дочерними тегами: p и form.HTML-разметка с фиолетовым фоном и div с двумя дочерними тегами: p и form.

HTML

Три обработчика JavaScript с жёлтым фоном: onSubmit, onLogin и onClick.Три обработчика JavaScript с жёлтым фоном: onSubmit, onLogin и onClick.

JavaScript

Но по мере того, как веб становился более интерактивным, логика всё больше определяла контент. JavaScript отвечал за HTML! Вот почемув React логика рендеринга и разметка находятся вместе в одном месте — компонентах.

React-компонент с перемешанными HTML и JavaScript из предыдущих примеров. Имя функции — Sidebar, которая вызывает функцию isLoggedIn, выделенную жёлтым. Вложенный внутрь функции код, выделенный фиолетовым, содержит тег p из предыдущего примера и тег Form, ссылающийся на компонент, показанный на следующей диаграмме.React-компонент с перемешанными HTML и JavaScript из предыдущих примеров. Имя функции — Sidebar, которая вызывает функцию isLoggedIn, выделенную жёлтым. Вложенный внутрь функции код, выделенный фиолетовым, содержит тег p из предыдущего примера и тег Form, ссылающийся на компонент, показанный на следующей диаграмме.

Sidebar.jsReact-компонент

React-компонент с перемешанными HTML и JavaScript из предыдущих примеров. Имя функции — Form, содержащей два обработчика onClick и onSubmit, выделенных жёлтым. За обработчиками следует HTML, выделенный фиолетовым. HTML содержит элемент form с вложенным элементом input, каждый из которых имеет проп onClick.React-компонент с HTML и JavaScript из предыдущих примеров, смешанными вместе. Имя функции — Form, содержащее два обработчика onClick и onSubmit, выделенные желтым. За обработчиками следует HTML, выделенный фиолетовым. HTML содержит элемент form с вложенным элементом input, каждый из которых имеет проп onClick.

Form.jsReact-компонент

Совместное хранение логики рендеринга кнопки и её разметки гарантирует, что они остаются синхронизированными при каждом изменении. Напротив, несвязанные детали, такие как разметка кнопки и разметка боковой панели, изолированы друг от друга, что делает безопасным изменение каждой из них по отдельности.

Каждый React-компонент — это JavaScript-функция, которая может содержать некоторую разметку, которую React отображает в браузере. React-компоненты используют синтаксическое расширение под названием JSX для представления этой разметки. JSX очень похож на HTML, но он немного строже и может отображать динамическую информацию. Лучший способ понять это — преобразовать некоторую HTML-разметку в JSX-разметку.

Примечание

JSX и React — это две разные вещи. Их часто используют вместе, но выможетеиспользовать их независимодруг от друга. JSX — это синтаксическое расширение, а React — библиотека JavaScript.

Преобразование HTML в JSX

Предположим, у вас есть некоторый (совершенно корректный) HTML:

И вы хотите поместить его в свой компонент:

Если вы скопируете и вставите его как есть, это не сработает:

Это связано с тем, что JSX строже и имеет несколько больше правил, чем HTML! Если вы прочитаете сообщения об ошибках выше, они помогут вам исправить разметку, или вы можете следовать руководству ниже.

Примечание

В большинстве случаев сообщения об ошибках React на экране помогут вам найти, где проблема. Прочитайте их, если застряли!

Правила JSX

1. Возвращайте один корневой элемент

Чтобы вернуть несколько элементов из компонента,оберните их одним родительским тегом.

Например, вы можете использовать<div>:

Если вы не хотите добавлять лишний<div>в разметку, вы можете написать<> и </>вместо этого:

Этот пустой тег называетсяФрагментом.Фрагменты позволяют группировать элементы, не оставляя следов в HTML-дереве браузера.

Deep Dive
Почему несколько JSX-тегов нужно оборачивать?

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

JSX требует явного закрытия тегов: самозакрывающиеся теги, такие как<img>, должны стать<img />, а оборачивающие теги, такие как<li>oranges, должны быть записаны как<li>oranges</li>.

Вот как выглядят закрытые изображение и элементы списка Хеди Ламарр:

3. Используйте camelCase дляпочти всего!

JSX преобразуется в JavaScript, а атрибуты, записанные в JSX, становятся ключами JavaScript-объектов. В своих компонентах вы часто будете хотеть читать эти атрибуты в переменные. Но в JavaScript есть ограничения на имена переменных. Например, их имена не могут содержать дефисы или быть зарезервированными словами, такими какclass.

Вот почему в React многие HTML- и SVG-атрибуты записываются в camelCase. Например, вместоstroke-widthвы используетеstrokeWidth. Посколькуclass— зарезервированное слово, в React вы пишетеclassNameвместо него, названное в честьсоответствующего DOM-свойства:

Вы можетенайти все эти атрибуты в списке пропсов DOM-компонентов.Если вы ошибётесь, не беспокойтесь — React выведет сообщение с возможным исправлением вконсоль браузера.

Подводный камень

По историческим причинам атрибутыaria-* и data-*записываются как в HTML — с дефисами.

Совет: используйте конвертер JSX

Преобразование всех этих атрибутов в существующей разметке может быть утомительным! Мы рекомендуем использоватьконвертердля перевода вашего существующего HTML и SVG в JSX. Конвертеры очень полезны на практике, но всё равно стоит понимать, что происходит, чтобы вы могли комфортно писать JSX самостоятельно.

Вот ваш окончательный результат:

Итоги

Теперь вы знаете, почему существует JSX и как использовать его в компонентах:

  • Компоненты React объединяют логику отрисовки с разметкой, потому что они связаны.
  • JSX похож на HTML, но имеет несколько отличий. При необходимости вы можете использоватьконвертер.
  • Сообщения об ошибках часто указывают правильное направление для исправления вашей разметки.

Попробуйте выполнить несколько заданий

Challenge 1 of 1:Преобразуйте HTML в JSX #

Этот HTML был вставлен в компонент, но он не является валидным JSX. Исправьте его:

Делать это вручную или использовать конвертер — решать вам!


Написание разметки с помощью JSX | React Learn - Reflow Hub