O que muda na sintaxe
Como mostramos no começo do workshop, o React implementou a ideia do jsx
para facilitar a descrição da estrutura da nossa aplicação.
Na prática, o JSX é uma extensão de sintaxe para o JavaScript que permite escrever HTML dentro do JavaScript. Então se você já conhece HTML e JS, não vai ser difícil entender o JSX. Mas você tem que se atentar a algumas diferenças.
HTML no meio do JS?
Pode parecer um pouco estranho ver HTML no meio do JS, mas é assim mesmo. Da mesma forma que você pode escrever uma string no meio do JS, você pode escrever HTML no meio do JS.
Fica mais ou menos assim:
Você pode também retornar HTML de dentro de uma função:
Expressões no meio do JSX
Até agora isso pode estar parecendo estranho, mas você começa a perceber o quão poderoso é quando mistura HTML com JS. Por exemplo, você pode fazer operações dinâmicas no meio do HTML:
No meio do HTML, você pode usar expressões JavaScript quando colocadas entre chaves {}
.
Da mesma forma você pode fazer isso com as propriedades de um elemento:
Com isso, você pode criar elementos dinamicamente, a partir de variáveis, funções, retornos de APIs, etc.
Composição de componentes
Quando você define um componente em JSX, você pode inseri-lo dentro de outro componente:
Tags com autofechamento vs Tags com childrens
Um componente pode ter filhos (children) ou não. Daqui a pouco vamos explorar em mais detalhes isso com as props
.
Portanto, você pode passar filhos para um componente abrindo e fechando suas tags. Por exemplo:
Quando um componente não tem filhos, ele pode ser auto fechado. Por exemplo:
Hierarquia de componentes
Quando um componente está dentro do outro, dizemos que eles são “pais” e “filhos”. Por exemplo:
Nesse caso, o componente App
é o “pai” e o componente Header
é o “filho”.
Nesse caso, o componente App
é o “pai” e o componente Header
é o “filho”. E o componente Header
por sua vez, tem como “filho” o componente UserAvatar
.
Por fim, se os componentes compartilham o mesmo “pai”, dizemos que eles são “irmãos”. Como o caso de Logo
e UserAvatar
acima.
Eventos
Os eventos do HTML são mapeados no JSX com o prefixo on
. Por exemplo:
Expressões condicionais
Você pode usar qualquer expressão JavaScript no JSX, inclusive condicionais. Por exemplo:
Outra coisa comum é utilizar o &&
para renderizar condicionalmente um elemento:
Curiosidade:
O que vai ser renderizado?
O que pode ser renderizado?
Como você viu acima, nem tudo pode ser renderizado no JSX.
O React vai exibir na tela somente strings
, numbers
e outros componentes jsx válidos.
Você pode também renderizar arrays contendo elementos válidos. Se você adicionar um array, o React vai transformar cada elemento do array em um elemento JSX.
Essa funcionalidade é bastante poderosa, pois você pode criar listas de elementos dinamicamente, utilizando o map
para iterar sobre o array.
Você pode chamar funções no meio do JSX, desde que elas retornem um valor válido.
Classes CSS
Para adicionar classes CSS no JSX, você deve usar a propriedade className
ao invés de class
. Você sabe porquê?
Como o JSX mistura HTML com JS, no HTML a palavra class
se refere ao atributo de classe CSS, enquanto no JavaScript a palavra class
se refere a uma classe (de orientação a objetos). Para que não haja conflito, o React usa className
para o atributo de classe CSS.