Различия между HTML и JSX
Автор конспекта: Арина Василевская
Полезные ссылки:
Для данного урока рекомендуется создать новый React-проект с помощью Vite.
Создадим два файла test.html:
и App.tsx:
JSX ≠ HTML
Главное отличие в том, что JSX — это не HTML, а JavaScript-синтаксис. Он описывает инструкции,
по которым React создаёт DOM-элементы и управляет ими. React выступает как посредник: берёт на
себя рутинную работу с реальными элементами, делая процесс эффективнее и позволяя разработчику
сосредоточиться на бизнес-логике приложения.
Виды HTML-тегов
1. Обычные (парные) теги
Имеют открывающий тег <tag> и закрывающий тег </tag>. Между ними находится содержимое.
Используются тогда, когда у элемента есть контент. Например, тег <div>.
2. Void-теги (самозакрывающиеся, одиночные)
Эти теги создают на странице самостоятельный элемент и не предназначены для того, чтобы содержать
внутри себя текст или другие теги. Поэтому их называют одиночными: они не имеют содержимого и не
требуют закрывающего тега. Например, тег <hr/>.
Ранее одиночные теги было принято завершать с помощью дополнительного слэша (/) перед
закрывающей скобкой, например: <input/> . В стандарте HTML5 такое написание считается необязательным, поэтому одиночные теги можно
оформлять как со слэшем, так и без него.
🔗 Более подробно о тегах можно почитать, перейдя по ссылкам:
Все void-элементы в JSX должны быть самозакрывающимися. Причина: JSX — это
JavaScript-синтаксис, а не HTML. У компилятора должно быть чёткое понимание: есть ли у тега
содержимое или нет.
Добавим тег <div>, с вложенным в него тегом <input/> со значением "it-incubator.io".
В App.tsx заменим наш фрагмент на аналогичный <div> из test.html:
Контролируемые и неконтролируемые элементы
При открытии проектов в браузере мы видим, что в test.html значение input можно менять, а в
App.tsx нет. Почему же так происходит?
-
HTML: поля ввода (например,<input>) по умолчанию работают самостоятельно — пользователь может свободно менять их содержимое. Такие элементы называют неуправляемыми. -
JSX: если дляinputзадать свойствоvalue, его состояние начинает контролироватьсяReact. Если вы попытаетесь изменить значение вручную,Reactбыстро вернёт его к заданномуvalue, поддерживая его актуальность.Reactактивно отслеживает события на странице: он перехватывает события на корневомdivи обрабатывает их, выступая прослойкой междуJSXи реальнымиDOM-элементами, чтобы корректно реагировать на взаимодействия пользователя.
События, которые происходят с элементами можно посмотреть в консоли разработчика:

Атрибуты vs Пропсы
Атрибуты
В HTML то, что мы передаём внутрь элемента, называется атрибутами. По сути, мы настраиваем
элемент, передавая ему значения, которые определяют его поведение. Например, можно задать входное
значение value или ограничить максимальную длину maxlength.
Особенности атрибутов в HTML:
- Значение атрибута всегда интерпретируется как строка. Даже если мы пишем число, браузер воспринимает его как текст.
HTMLдопускает опускание кавычек для простых значений, но обычно их ставят.- Булевыe атрибуты: наличие такого атрибута (например,
disabled) делает элемент неактивным, независимо от того, какое значение ему присвоено (disabled, disabled="true",disabled="false",disabled=""— все приведут к одному результату). Главное — само присутствие атрибута.
Пропсы
В React (JSX) вместо атрибутов используются props. Пропсы(props) — это свойства
JavaScript-объекта, которые передаются компоненту или элементу. Они могут содержать значения
любого типа: строки, числа, булевы значения, массивы, объекты и т.д.
Ссылка на документацию React Components
Особенности пропсов в JSX:
- Чувствительность к регистру: имена пропсов соответствуют свойствам объектов JavaScript. Для
названий
propsиспользуетсяcamelCaseНапример,maxlengthвHTMLстановитсяmaxLengthвJSX/TypeScript. При работеTypeScriptподсказывает верное написание. - Типизация: TypeScript помогает строго типизировать пропсы. Например, для maxLength ожидается число, а не строка, поэтому передаем его в фигурных скобках: 15.
- Булевыe значения: в JSX
boolean propsзадаются явно: disabled={true}— элемент неактивен.disabled={false}— элемент активен (атрибут disabled не добавляется в DOM).
Стили
Inline styles
В HTML inline styles(инлайновые стили) представляют собой одну большую строку, что неудобно
для работы. Это не лучшая практика, но иногда применяется, например, при быстром изменении внешнего
вида элемента в ответ на действия пользователя.
Особенности:
- свойства отделяются друг от друга точкой с запятой;
- названия свойств пишутся так же, как в
CSS— в форматеkebab-case;
В JSX inline styles называются CSS-in-JS и передаются как объект JavaScript, где ключ —
это имя свойства CSS, а значение — его значение.
Особенности:
- поскольку
JSXпозволяет использовать выраженияJavaScriptвнутри фигурных скобок, для передачи объекта стилей используются двойные фигурные скобки{{}}. - свойства отделяются запятыми, а не точкой с запятой.
- для названий свойств
CSSиспользуетсяcamelCase(например,backgroundColorвместоbackground-color).
CSS-классы
Инлайновые стили быстро «захламляют» код и отвлекают от логики. Поэтому чаще стили выносят в
отдельные CSS-файлы и подключают через классы. В файле index.css создадим класс title:
В HTML класс задаётся атрибутом class.
В JSX используется не class, а className:
В JavaScript ключевое слово class зарезервировано для объявления классов. Так как в React
элементы представляют собой объекты DOM, у них используется свойство className, а не class.
Поэтому React следует DOM-модели и устанавливает классы через DOM API: element.className.
При инспекции в браузере (F12) атрибут class всё равно виден в разметке, но на уровне объекта
DOM React работает именно со свойством className.
Можно также присваивать несколько классов, это делается через пробел, как в HTML, так и в
JSX:
Подробнее о Style и class
🏠 Домашнее задание
Различия между HTML и JSX
Цель задания
Закрепить понимание различий между HTML-атрибутами и JSX-пропсами, научиться корректно
переводить HTML-разметку в JSX.
Задание 1
Подготовка
- Создайте новый
React-проектс помощьюVite. Можете делать домашнее задание в проекте в котором вы учились создавать проект (lesson-04) - Удалите файл
index.css - Удалите все стили из
App.css. Файл не удаляйте, в дальнейшем он пригодится - В
App.tsxудалите весь шаблонный код и отрисуйте разметку, приведенную ниже
Поправьте импорт в main.tsx
- Запустите проект и убедитесь, что в браузере вы увидели заголовок
Мой музыкальный плеер
Задание 2
Преобразование HTML в JSX
- Создайте в
srcдиректории новый файлplayer.htmlи вставьте в него следующийHTML-код
- Откройте
player.htmlв браузере и убедитесь что на экране будет отображениеhtml разметки - В файле
App.tsxперепишитеhtml разметкувJSX, исправив все ошибки и адаптировав подReact
В итоге вы должны получить точно такой же результат как и в player.html

Задание 3
Работа со стилями
- В файле
App.cssсоздайте новый класс.player-title, перенесите инлайновые заголовкаМой музыкальный плеери примените полученный класс вApp.tsx - Добавьте стили для всего блока (
music-player) и добавьте вApp.tsx. - Для
inputиtextareaдобавьте новый классform-control. А также сделайте неактивнымиinputиtextareaповесив на них нужный атрибут
Должен получиться следующий результат 🚀

Совет: Если что-то кажется сложным, не переживайте! Это нормально на начальном этапе. Главное
— это практика и постепенное понимание концепций React.


