JavaScript в JSX с фигурными скобками¶
JSX позволяет вам писать HTML-подобную разметку внутри файла JavaScript, сохраняя логику рендеринга и содержимое в одном месте. Иногда вы захотите добавить немного логики JavaScript или сослаться на динамическое свойство внутри этой разметки. В этой ситуации вы можете использовать фигурные скобки в JSX, чтобы использовать JavaScript.
Вы узнаете
- Как передавать строки с кавычками
- Как ссылаться на переменную JavaScript внутри JSX с помощью фигурных скобок
- Как вызвать функцию JavaScript в JSX с помощью фигурных скобок
- Как использовать объект JavaScript внутри JSX с фигурными скобками
Передача строк с кавычками¶
Когда вы хотите передать строковый атрибут в JSX, вы заключаете его в одинарные или двойные кавычки:
1 2 3 4 5 6 7 8 9 |
|
Здесь "https://i.imgur.com/7vQD0fPs.jpg"
и "Gregorio Y. Zara"
передаются как строки.
Но что если вы хотите динамически указать текст src
или alt
? Вы можете использовать значение из JavaScript, заменив "
и "
на {
и }
:
1 2 3 4 5 6 7 8 9 10 11 |
|
Обратите внимание на разницу между className="avatar"
, которая определяет имя CSS-класса "avatar"
, который делает изображение круглым, и src={avatar}
, которая читает значение переменной JavaScript под названием avatar
. Это потому, что фигурные скобки позволяют вам работать с JavaScript прямо в вашей разметке!
Использование фигурных скобок: Окно в мир JavaScript¶
JSX - это особый способ написания JavaScript. Это означает, что можно использовать JavaScript внутри него - с фигурными скобками { }
. В приведенном ниже примере сначала объявляется имя ученого, name
, затем оно помещается в фигурные скобки внутри <h1>
:
1 2 3 4 |
|
Попробуйте изменить значение name
с Грегорио Й. Зара
на Хеди Ламарр
. Видите, как изменился заголовок списка?
Любое выражение JavaScript будет работать между фигурными скобками, включая вызовы функций, таких как formatDate()
:
1 2 3 4 5 6 7 8 9 10 11 |
|
Где использовать фигурные скобки¶
В JSX фигурные скобки можно использовать только двумя способами:
- В качестве текста непосредственно внутри тега JSX:
<h1>{name}'s To Do List</h1>
работает, а<{tag}>Gregorio Y. Zara's To Do List</{tag}>
не работает. - Атрибуты сразу после знака
=
:src={avatar}
прочитает переменнуюavatar
, ноsrc="{avatar}"
передаст строку"{avatar}"
.
Использование "двойных завитушек": CSS и другие объекты в JSX¶
Помимо строк, чисел и других выражений JavaScript, в JSX можно передавать даже объекты. Объекты также обозначаются фигурными скобками, например { name: "Hedy Lamarr", inventions: 5 }
. Поэтому, чтобы передать объект JS в JSX, вы должны обернуть объект в другую пару фигурных скобок: person={{ name: "Hedy Lamarr", inventions: 5 }}
.
Подобное можно увидеть при использовании встроенных стилей CSS в JSX. React не требует использования встроенных стилей (классы CSS отлично подходят для большинства случаев). Но когда вам нужен встроенный стиль, вы передаете объект в атрибут style
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Попробуйте изменить значения backgroundColor
и color
.
Вы действительно можете увидеть объект JavaScript внутри фигурных скобок, если напишете его так:
1 2 3 4 5 6 |
|
Когда в следующий раз вы увидите {{
и }}
в JSX, знайте, что это не что иное, как объект внутри JSX curlies!
Внимание
Инлайн-свойства style
записываются в camelCase. Например, HTML <ul style="background-color: black">
будет записан как <ul style={{ backgroundColor: 'black' }}>
в вашем компоненте.
Больше веселья с объектами JavaScript и фигурными скобками¶
Вы можете поместить несколько выражений в один объект и ссылаться на них в JSX внутри фигурных скобок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
В этом примере объект JavaScript person
содержит строку name
и объект theme
:
1 2 3 4 5 6 7 |
|
Компонент может использовать эти значения из person
следующим образом:
1 2 3 |
|
JSX очень минимален как язык шаблонов, потому что он позволяет организовать данные и логику с помощью JavaScript.
Итого
Теперь вы знаете почти все о JSX:
- Атрибуты JSX, заключенные в кавычки, передаются как строки.
- Фигурные скобки позволяют вам привнести логику и переменные JavaScript в вашу разметку.
- Они работают внутри содержимого тега JSX или сразу после
=
в атрибутах. {{
и}}
- это не специальный синтаксис: это объект JavaScript, помещенный в фигурные скобки JSX.
Задачи¶
1. Исправьте ошибку¶
Этот код аварийно завершается с ошибкой Objects are not valid as a React child
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Можете ли вы найти проблему?
Показать подсказку
Посмотрите, что находится внутри фигурных скобок. Мы поместили туда то, что нужно?
Показать решение
Это происходит потому, что в данном примере в разметку помещается сам объект, а не строка: <h1>{person}'s Todos</h1>
пытается отобразить весь объект person
! Включение необработанных объектов в текстовое содержимое приводит к ошибке, потому что React не знает, как вы хотите их отобразить.
Чтобы исправить это, замените <h1>{person}'s Todos</h1>
на <h1>{person.name}'s Todos</h1>
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
2. Извлечение информации в объект¶
Извлеките URL изображения в объект person
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Показать решение
Переместите URL изображения в свойство person.imageUrl
и считайте его из тега <img>
с помощью фигурных символов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
3. Запишите выражение внутри фигурных скобок JSX¶
В приведенном ниже объекте полный URL изображения разделен на четыре части: базовый URL, imageId
, imageSize
и расширение файла.
Мы хотим, чтобы URL изображения объединял эти атрибуты: базовый URL (всегда 'https://i.imgur.com/'
), imageId
('7vQD0fP'
), imageSize
('s'
) и расширение файла (всегда 'jpg'
). Однако что-то не так с тем, как тег <img>
указывает свой src
.
Вы можете это исправить?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
Чтобы проверить, что ваше исправление сработало, попробуйте изменить значение imageSize
на 'b'
. Размер изображения должен измениться после вашей правки.
Показать решение
Вы можете записать это как src={baseUrl + person.imageId + person.imageSize + '.jpg'}
.
{
открывает выражение JavaScriptbaseUrl + person.imageId + person.imageSize + '.jpg'
выдает правильную строку URL}
закрывает выражение JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
Вы также можете перенести это выражение в отдельную функцию, как getImageUrl
ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
1 2 3 4 5 6 7 8 |
|
Переменные и функции помогут вам сохранить простоту разметки!
Источник — https://react.dev/learn/javascript-in-jsx-with-curly-braces