JavaScript в JSX с фигурными скобками
JSX позволяет писать разметку, похожую на HTML, внутри файла JavaScript, сохраняя логику отрисовки и содержимое в одном месте. Иногда вам нужно добавить немного JavaScript-логики или сослаться на динамическое свойство внутри этой разметки. В этом случае вы можете использовать фигурные скобки в вашем JSX, чтобы открыть окно в JavaScript.
Вы узнаете
- Как передавать строки с кавычками
- Как ссылаться на переменную JavaScript внутри JSX с фигурными скобками
- Как вызывать JavaScript-функцию внутри JSX с фигурными скобками
- Как использовать JavaScript-объект внутри JSX с фигурными скобками
Передача строк с кавычками
Когда вы хотите передать строковое свойство в JSX, вы помещаете его в одинарные или двойные кавычки:
export default function Avatar() { return ( <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> ); }
Здесь "https://i.imgur.com/7vQD0fPs.jpg" и "Gregorio Y. Zara" передаются как строки.
Но что, если вы хотите динамически указать текст src или alt? Вы можете использовать значение из JavaScript, заменив " и " на { и }:
export default function Avatar() { const avatar = 'https://i.imgur.com/7vQD0fPs.jpg'; const description = 'Gregorio Y. Zara'; return ( <img className="avatar" src={avatar} alt={description} /> ); }
Обратите внимание на разницу между className="avatar", который указывает имя класса CSS "avatar", делающего изображение круглым, и src={avatar}, который считывает значение переменной JavaScript под названием avatar. Это потому, что фигурные скобки позволяют работать с JavaScript прямо в вашей разметке!
Использование фигурных скобок: окно в мир JavaScript
JSX — это особый способ написания JavaScript. Это означает, что вы можете использовать JavaScript внутри него — с фигурными скобками { }. В примере ниже сначала объявляется имя ученого name, а затем оно вставляется с помощью фигурных скобок внутри <h1>:
export default function TodoList() { const name = 'Gregorio Y. Zara'; return ( <h1>{name}'s To Do List</h1> ); }
Попробуйте изменить значение name с 'Gregorio Y. Zara' на 'Hedy Lamarr'. Обратите внимание, как меняется заголовок списка?
Любое JavaScript-выражение будет работать внутри фигурных скобок, включая вызовы функций, такие как formatDate():
const today = new Date(); function formatDate(date) { return new Intl.DateTimeFormat( 'en-US', { weekday: 'long' } ).format(date); } export default function TodoList() { return ( <h1>To Do List for {formatDate(today)}</h1> ); }
Где использовать фигурные скобки
Вы можете использовать фигурные скобки внутри 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:
export default function TodoList() { return ( <ul style={{ backgroundColor: 'black', color: 'pink' }}> <li>Improve the videophone</li> <li>Prepare aeronautics lectures</li> <li>Work on the alcohol-fuelled engine</li> </ul> ); }
Попробуйте изменить значения backgroundColor и color.
Вы можете увидеть JavaScript-объект внутри фигурных скобок, когда вы напишете его так:
<ul style={
{
backgroundColor: 'black',
color: 'pink'
}
}> В следующий раз, когда вы увидите {{ и }} в JSX, знайте, что это не что иное, как объект внутри фигурных скобок JSX!
Ловушка
Встроенные style свойства пишутся в формате camelCase. Например, HTML <ul style="background-color: black"> будет записано как <ul style={{ backgroundColor: 'black' }}> в вашем компоненте.
Больше возможностей с JavaScript-объектами и фигурными скобками
Вы можете поместить несколько выражений в один объект и сослаться на них в вашем JSX внутри фигурных скобок:
const person = { name: 'Gregorio Y. Zara', theme: { backgroundColor: 'black', color: 'pink' } }; export default function TodoList() { return ( <div style={person.theme}> <h1>{person.name}'s Todos</h1> <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> <ul> <li>Improve the videophone</li> <li>Prepare aeronautics lectures</li> <li>Work on the alcohol-fuelled engine</li> </ul> </div> ); }
В этом примере person JavaScript-объект содержит строку name и объект theme:
const person = {
name: 'Gregorio Y. Zara',
theme: {
backgroundColor: 'black',
color: 'pink'
}
}; Компонент может использовать эти значения из person следующим образом:
<div style={person.theme}>
<h1>{person.name}'s Todos</h1> JSX очень минималистичен как язык шаблонов, потому что он позволяет организовывать данные и логику с помощью JavaScript.
Резюме
Теперь вы знаете почти всё о JSX:
- Атрибуты JSX в кавычках передаются как строки.
- Фигурные скобки позволяют внедрять JavaScript-логику и переменные в вашу разметку.
- Они работают внутри содержимого тега JSX или сразу после
=в атрибутах. -
{{и}}— это не специальный синтаксис: это JavaScript-объект, заключённый внутри фигурных скобок JSX.
Попробуйте выполнить некоторые задания
Задача 1 из 3:
Исправить ошибку
Этот код завершается ошибкой с сообщением Objects are not valid as a React child:
const person = { name: 'Gregorio Y. Zara', theme: { backgroundColor: 'black', color: 'pink' } }; export default function TodoList() { return ( <div style={person.theme}> <h1>{person}'s Todos</h1> <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> <ul> <li>Improve the videophone</li> <li>Prepare aeronautics lectures</li> <li>Work on the alcohol-fuelled engine</li> </ul> </div> ); }
Можете ли вы найти проблему?
© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://react.dev/learn/javascript-in-jsx-with-curly-braces