JavaScript in JSX with Curly Braces
JSX permite a você escrever tags como faria no HTML dentro de um arquivo JavaScript, mantendo a lógica de renderização e o conteúdo no mesmo local. Às vezes, você pode querer adicionar um pouco de lógica JavaScript ou fazer referência a uma propriedade dinâmica dentro desse bloco de tags. Nessa situação, você pode usar chaves em seu JSX para abrir uma janela para o JavaScript.
Você aprenderá
- Como passar strings com aspas
- Como fazer referência a uma variável JavaScript dentro do JSX com chaves
- Como chamar uma função JavaScript dentro do JSX com chaves
- Como usar um objeto JavaScript dentro do JSX com chaves
Passando strings com aspas
Quando quiser passar um atributo de string para o JSX, coloque-o entre aspas simples ou duplas:
export default function Avatar() { return ( <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> ); }
Neste caso, "https://i.imgur.com/7vQD0fPs.jpg"
e "Gregorio Y. Zara"
estão sendo passados como strings.
Mas e se você quiser especificar dinamicamente o atributo src
ou alt
? Você poderia usar um valor do JavaScript substituindo "
e "
por {
e }
:
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} /> ); }
Note a diferença entre className="avatar"
, que especifica um nome de classe CSS "avatar"
para tornar a imagem redonda, e src={avatar}
, que lê o valor da variável JavaScript chamada avatar
. Isso ocorre porque as chaves permitem que você trabalhe com JavaScript diretamente em seu bloco de tags!
Usando chaves: Uma janela para o mundo do JavaScript
JSX é uma forma especial de escrever JavaScript. Isso significa que é possível usar JavaScript dentro dele - com chaves { }
. O exemplo abaixo primeiro declara um nome para o cientista, name
, e depois insere o nome dentro do <h1>
com chaves:
export default function TodoList() { const name = 'Gregorio Y. Zara'; return ( <h1>{name}'s To Do List</h1> ); }
Tente trocar o valor do name
de 'Gregorio Y. Zara'
para 'Hedy Lamarr'
. Está vendo como o título da lista muda?
Qualquer expressão JavaScript funcionará entre chaves, incluindo chamadas de função como 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> ); }
Onde usar chaves
Você só pode usar chaves de duas maneiras dentro do JSX:
- Como texto diretamente dentro de uma tag JSX:
<h1>{nome}'s To Do List</h1>
funciona, mas<{tag}>Gregorio Y. Zara's To Do List</{tag}>
não. - Como atributos imediatamente após o sinal
=
:src={avatar}
vai ler a variávelavatar
, massrc="{avatar}"
vai passar a string"{avatar}"
.
Uso de “chaves duplas”: CSS e outros objetos em JSX
Além de strings, números e outras expressões JavaScript, você pode até passar objetos em JSX. Os objetos também são denotados por chaves, como { name: "Hedy Lamarr", inventions: 5 }
. Portanto, para passar um objeto JS em JSX, você deve envolver o objeto em outro par de chaves: person={{ name: "Hedy Lamarr", inventions: 5 }}
.
Você pode ver isso com estilos CSS inline no JSX. O React não exige que você use estilos inline (as classes CSS funcionam muito bem na maioria dos casos). Mas quando você precisa de um estilo inline, você passa um objeto para o atributo 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> ); }
Tente alterar os valores de backgroundColor
e color
.
Você pode ver claramente o objeto JavaScript dentro das chaves quando o escreve dessa forma:
<ul style={
{
backgroundColor: 'black',
color: 'pink'
}
}>
Da próxima vez que você vir {{
e }}
em JSX, saiba que isso é nada mais do que um objeto dentro das chaves de JSX!
Mais diversão com objetos JavaScript e chaves
Você pode colocar várias expressões dentro de um objeto e referenciá-las em seu JSX dentro de chaves:
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> ); }
Neste exemplo, o objeto JavaScript person
contém uma string name
e um objeto theme
:
const person = {
name: 'Gregorio Y. Zara',
theme: {
backgroundColor: 'black',
color: 'pink'
}
};
O componente pode usar os valores de person
da seguinte forma:
<div style={person.theme}>
<h1>{person.name}'s Todos</h1>
JSX é uma linguagem de tags mínima, pois permite que você organize dados e lógica usando JavaScript.
Recap
Agora você sabe quase tudo sobre JSX:
- Os atributos JSX entre aspas são passados como strings.
- As chaves permitem que você inclua a lógica e as variáveis do JavaScript em seu bloco de tags.
- Elas funcionam dentro do conteúdo da tag JSX ou imediatamente após
=
nos atributos. {{
e}}
não é uma sintaxe especial: é um objeto JavaScript colocado entre chaves JSX.
Challenge 1 of 3: Corrija o erro
Esse código é interrompido com um erro que diz 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> ); }
Você consegue identificar o problema?