JSX - это технология, представленная React. Давайте погрузимся в это
- Введение в JSX
- Праймер JSX
- Транспортировка JSX
- JS в JSX
- HTML в JSX
- CSS в React
- Формы в JSX
- JSX автоматически сбегает
- Пробел в JSX
- Добавление комментариев в JSX
- Атрибуты распространения
- Как выполнить цикл в JSX
Введение в JSX
JSX - это технология, представленная React.
Хотя React может отлично работать без использования JSX, это идеальная технология для работы с компонентами, поэтому React очень выигрывает от JSX.
Сначала вы могли подумать, что использование JSX похоже на смешивание HTML иJavaScript(и, как вы увидите, CSS).
Но это неправда, потому что на самом деле при использовании синтаксиса JSX вы пишете декларативный синтаксис того, каким должен быть пользовательский интерфейс компонента.
И вы описываете этот пользовательский интерфейс, не используя строки, а вместо этого используя JavaScript, который позволяет вам делать много хороших вещей.
Праймер JSX
Вот как вы определяете тег h1, содержащий строку:
const element = <h1>Hello, world!</h1>
Это похоже на странную смесь JavaScript и HTML, но на самом деле это все JavaScript.
То, что выглядит как HTML, на самом деле является синтаксическим сахаром для определения компонентов и их расположения внутри разметки.
Внутри выражения JSX можно очень легко вставить атрибуты:
const myId = 'test'
const element = <h1 id={myId}>Hello, world!</h1>
Вам просто нужно обратить внимание, когда у атрибута есть тире (-
), который вместо этого преобразуется в синтаксис camelCase, и эти 2 особых случая:
class
становитсяclassName
for
становитсяhtmlFor
потому что это зарезервированные слова в JavaScript.
Вот фрагмент JSX, который объединяет два компонента вdiv
тег:
<div>
<BlogPostsList />
<Sidebar />
</div>
Тег всегда нужно закрывать, потому что это больше XML, чем HTML (если вы помните дни XHTML, это будет вам знакомо, но с тех пор свободный синтаксис HTML5 победил). В этом случае используется самозакрывающийся тег.
Обратите внимание, как я обернул 2 компонента вdiv
. Почему? Потому чтофункция render () может возвращать только один узел, поэтому, если вы хотите вернуть двух братьев и сестер, просто добавьте родителя. Это может быть любой тег, а не толькоdiv
.
Транспортировка JSX
Браузер не может выполнять файлы JavaScript, содержащие код JSX. Их нужно сначала преобразовать в обычный JS.
Как? Выполняя процесс под названиемтранспиляция.
Мы уже говорили, что JSX является необязательным, потому что для каждой строки JSX доступна соответствующая альтернатива простого JavaScript, и именно в это JSX переносится.
Например, следующие две конструкции эквивалентны:
Обычный JS
ReactDOM.render(
React.createElement('div', { id: 'test' },
React.createElement('h1', null, 'A title'),
React.createElement('p', null, 'A paragraph')
),
document.getElementById('myapp')
)
JSX
ReactDOM.render(
<div id="test">
<h1>A title</h1>
<p>A paragraph</p>
</div>,
document.getElementById('myapp')
)
Этот очень простой пример является лишь отправной точкой, но вы уже можете видеть, насколько сложнее простой синтаксис JS по сравнению с использованием JSX.
На момент написания статьи самый популярный способ выполнениятранспиляцияиспользоватьВавилон, который является параметром по умолчанию при запускеcreate-react-app
, так что если вы его используете, вам не о чем беспокоиться, все происходит за вас.
Если вы не используетеcreate-react-app
вам нужно настроить Babel самостоятельно.
JS в JSX
JSX принимает любой смешанный JavaScript.
Всякий раз, когда вам нужно добавить JS, просто вставьте его в фигурные скобки.{}
. Например, вот как использовать постоянное значение, определенное в другом месте:
const paragraph = 'A paragraph'
ReactDOM.render(
<div id="test">
<h1>A title</h1>
<p>{paragraph}</p>
</div>,
document.getElementById('myapp')
)
Это простой пример. Фигурные скобки принимаютлюбойКод JS:
const paragraph = 'A paragraph'
ReactDOM.render(
<table>
{rows.map((row, i) => {
return <tr>{row.text}</tr>
})}
</table>,
document.getElementById('myapp')
)
Как вы видетемы вложили JavaScript в JSX, определенный внутри JavaScript, вложенный в JSX. Вы можете пойти настолько глубоко, насколько захотите.
HTML в JSX
JSX очень похож на HTML, но на самом деле это синтаксис XML.
В конце концов, вы визуализируете HTML, поэтому вам нужно знать несколько различий между тем, как вы определяете некоторые вещи в HTML, и тем, как вы определяете их в JSX.
Вам нужно закрыть все теги
Как и в XHTML, если вы когда-либо использовали его, вам нужно закрыть все теги: не более<br>
но вместо этого используйте самозакрывающийся тег:<br />
(то же самое и с другими тегами)
camelCase - это новый стандарт
В HTML вы найдете атрибуты без регистра (например,onchange
). В JSX они переименованы в их эквивалент camelCase:
onchange
=>onChange
onclick
=>onClick
onsubmit
=>onSubmit
class
становитсяclassName
В связи с тем, что JSX - это JavaScript, иclass
это зарезервированное слово, вы не можете писать
<p class="description">
но вам нужно использовать
<p className="description">
То же самое относится кfor
который переведен наhtmlFor
.
Атрибут стиля меняет свою семантику
Вstyle
Атрибут в HTML позволяет указать встроенный стиль. В JSX он больше не принимает строку, а вCSS в Reactвы поймете, почему это очень удобное изменение.
Формы
В JSX изменено определение полей формы и события для большей согласованности и полезности.
Формы в JSXболее подробно рассматривается в формах.
CSS в React
JSX предоставляет отличный способ определения CSS.
Если у вас есть небольшой опыт работы со встроенными стилями HTML, на первый взгляд вы обнаружите, что вас отодвинули на 10 или 15 лет назад, в мир, где встроенный CSS был совершенно нормальным (в настоящее время он демонизируется и обычно является просто «быстрым исправлением»). решение).
Стиль JSX - это не одно и то же: во-первых, вместо того, чтобы принимать строку, содержащую свойства CSS, JSXstyle
атрибут принимает только объект. Это означает, что вы определяете свойства в объекте:
var divStyle = {
color: 'white'
}
ReactDOM.render(<div style={divStyle}>Hello World!</div>, mountNode)
или же
ReactDOM.render(<div style={{ color: 'white' }}>Hello World!</div>, mountNode)
Значения CSS, которые вы пишете в JSX, немного отличаются от обычного CSS:
- имена свойств ключей имеют верблюжий регистр
- значения - это просто строки
- вы разделяете каждый кортеж запятой
Почему это предпочтительнее простого CSS / SASS / LESS?
CSS - этонерешенная проблема. С момента его создания десятки инструментов вокруг него поднимались, а затем опускались. Основная проблема с CSS заключается в том, что здесь нет области видимости, и легко написать CSS, который никоим образом не применяется, поэтому «быстрое исправление» может повлиять на элементы, которые нельзя трогать.
JSX позволяет компонентам (например, определенным в React) полностью инкапсулировать свой стиль.
Это подходящее решение?
Встроенные стили в JSX хороши, пока вам не понадобится
- писать медиа-запросы
- стиль анимации
- ссылочные псевдоклассы (например,
:hover
) - ссылочные псевдоэлементы (например,
::first-letter
)
Короче говоря, они охватывают основы, но это не окончательное решение.
Формы в JSX
JSX вносит некоторые изменения в работу HTML-форм, чтобы упростить работу разработчика.
value
иdefaultValue
Вvalue
атрибут всегда содержит текущее значение поля.
ВdefaultValue
Атрибут содержит значение по умолчанию, которое было установлено при создании поля.
Это помогает решить странное поведение обычныхДОМвзаимодействие при осмотреinput.value
иinput.getAttribute('value')
возвращает одно текущее значение и одно исходное значение по умолчанию.
Это также относится кtextarea
поле, например
<textarea>Some text</textarea>
но вместо
<textarea defaultValue={'Some text'} />
Заselect
поля вместо использования
<select>
<option value="x" selected>
...
</option>
</select>
использовать
<select defaultValue="x">
<option value="x">...</option>
</select>
Более последовательный onChange
Передача функции вonChange
атрибут вы можете подписаться на события в полях формы.
Он работает стабильно в разных областях, дажеradio
,select
иcheckbox
поля ввода запускаютonChange
мероприятие.
onChange
также срабатывает при вводе символа вinput
или жеtextarea
поле.
JSX автоматически сбегает
Чтобы снизить постоянный риск эксплойтов XSS, JSX принудительно выполняет автоматическое экранирование выражений.
Это означает, что вы можете столкнуться с проблемами при использовании объекта HTML в строковом выражении.
Вы ожидаете, что будет напечатано следующее© 2020
:
<p>{'© 2020'}</p>
Но это не так, это печать© 2020
потому что строка экранирована.
Чтобы исправить это, вы можете переместить объекты за пределы выражения:
<p>© 2020</p>
или используя константу, которая печатает представление Unicode, соответствующее объекту HTML, который вам нужно распечатать:
<p>{'\u00A9 2020'}</p>
Пробел в JSX
Чтобы добавить пробел в JSX, есть 2 правила:
Horizontal white space is trimmed to 1
Если у вас есть пробелы между элементами в одной строке, все они обрезаются до 1 пробела.
<p>Something becomes this</p>
становится
<p>Something becomes this</p>
Устранены вертикальные пробелы
<p>
Something
becomes
this
</p>
становится
<p>Somethingbecomesthis</p>
Чтобы решить эту проблему, вам нужно явно добавить пробел, добавив такое выражение для пробела:
<p>
Something
{' '}becomes
{' '}this
</p>
или вставив строку в пробел:
<p>
Something
{' becomes '}
this
</p>
Добавление комментариев в JSX
Вы можете добавлять комментарии к JSX, используя обычные комментарии JavaScript внутри выражения:
<p>
{/* a comment */}
{
//another comment
}
</p>
Атрибуты распространения
В JSX обычной операцией является присвоение значений атрибутам.
Вместо того, чтобы делать это вручную, например
<div>
<BlogPost title={data.title} date={data.date} />
</div>
ты можешь пройти
<div>
<BlogPost {...data} />
</div>
и свойстваdata
объект будет использоваться как атрибут автоматически, благодаря ES6оператор распространения.
Как выполнить цикл в JSX
Если у вас есть набор элементов, которые необходимо выполнить в цикле для генерации партиала JSX, вы можете создать цикл, а затем добавить JSX в массив:
const elements = [] //..some array
const items = []
for (const [index, value] of elements.entries()) {
items.push(<Element key={index} />)
}
Теперь при рендеринге JSX вы можете встроитьitems
массив, заключив его в фигурные скобки:
const elements = ['one', 'two', 'three'];
const items = []
for (const [index, value] of elements.entries()) {
items.push(<li key={index}>{value}</li>)
}
return (
<div>
{items}
</div>
)
Вы можете сделать то же самое прямо в JSX, используяmap
вместо цикла for:
const elements = ['one', 'two', 'three'];
return (
<ul>
{elements.map((value, index) => {
return <li key={index}>{value}</li>
})}
</ul>
)
Скачать мою бесплатнуюСправочник по React
Больше руководств по реакции:
- Пример простого приложения React: получение информации о пользователях GitHub через API
- Создайте простой счетчик с помощью React
- Настройка VS Code для разработки на React
- Как передать реквизиты дочернему компоненту через React Router
- Создайте приложение с Electron и React
- Учебник: создание электронной таблицы с помощью React
- Дорожная карта для изучения React
- Узнайте, как использовать Redux
- Начало работы с JSX
- Стилизованные компоненты
- Введение в Redux Saga
- Введение в React Router
- Введение в React
- Компоненты React
- Виртуальный DOM
- Реагировать на события
- Состояние реакции
- React Props
- Фрагмент реакции
- API контекста React
- React PropTypes
- Концепции React: декларативный
- Реагировать: как показать другой компонент при нажатии
- Как зацикливаться внутри React JSX
- Props vs State в React
- Что лучше: jQuery или React?
- Сколько JavaScript вам нужно знать, чтобы использовать React?
- Введение в Гэтсби
- Как сослаться на элемент DOM в React
- Однонаправленный поток данных в React
- Реагировать на компоненты более высокого порядка
- Реагировать на события жизненного цикла
- Концепция React: неизменность
- Концепция React: чистота
- Введение в React Hooks
- Введение в приложение create-react-app
- Концепция React: композиция
- React: презентационные и контейнерные компоненты
- Разделение кода в React
- Рендеринг на стороне сервера с помощью React
- Как установить React
- CSS в React
- Использование SASS в React
- Обработка форм в React
- React StrictMode
- Реагировать на порталы
- React Render Props
- Тестирование компонентов React
- Как передать параметр обработчикам событий в React
- Как обрабатывать ошибки в React
- Как вернуть несколько элементов в JSX
- Условный рендеринг в React
- React, как передать props дочерним компонентам
- Как получить значение элемента ввода в React
- Как использовать хук useState React
- Как использовать хук useCallback React
- Как использовать хук useEffect React
- Как использовать хук useMemo React
- Как использовать хук useRef React
- Как использовать хук useContext React
- Как использовать хук useReducer React
- Как подключить приложение React к бэкэнду в том же источнике
- Учебное пособие по маршрутизатору Reach Router
- Как использовать инструменты разработчика React
- Как научиться React
- Как отлаживать приложение React
- Как отрендерить HTML в React
- Как исправить ошибку `dangerousSetInnerHTML` не соответствовало в React
- Как я исправил проблему с состоянием формы входа в React и автозаполнением браузера
- Как настроить HTTPS в приложении React на локальном хосте
- Как исправить ошибку "не удается обновить компонент при рендеринге другого компонента" в React
- Могу ли я использовать перехватчики React внутри условного оператора?
- Использование useState с объектом: как обновить
- Как перемещать блоки кода с помощью React и Tailwind
- React, сфокусируйте элемент в React при добавлении в DOM
- Реагировать, редактировать текст по двойному щелчку