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:
const element = <h1>Hello, world!</h1>;Você pode também retornar HTML de dentro de uma função:
function App() { return <h1>Hello, world!</h1>;}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:
function App() { return ( <div> <h1>A data de hoje é {new Date().toLocaleDateString()}</h1> </div> );}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:
function App() { const imageUrl = "https://via.placeholder.com/150";
return <img src={imageUrl} alt="placeholder" />;}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:
function UserAvatar() { return <img src="https://via.placeholder.com/150" alt="placeholder" />;}
function Header() { return ( <div> <UserAvatar /> </div> );}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:
function Books() { return ( <BookList> <div> <h1>Livros</h1> </div> </BookList> );}Quando um componente não tem filhos, ele pode ser auto fechado. Por exemplo:
function BookItem() { return <Book />;}Hierarquia de componentes
Quando um componente está dentro do outro, dizemos que eles são “pais” e “filhos”. Por exemplo:
function App() { return <Header />;}Nesse caso, o componente App é o “pai” e o componente Header é o “filho”.
function App() { return ( <Header> <UserAvatar /> </Header> );}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.
function App() { return ( <Header> <Logo /> <UserAvatar /> </Header> );}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:
function Button() { return <button onClick={() => alert("Clicou")}>Clique aqui</button>;}Expressões condicionais
Você pode usar qualquer expressão JavaScript no JSX, inclusive condicionais. Por exemplo:
function App() { return ( <div>{isLoggedIn ? <p>Bem vindo, usuário!</p> : <p>Faça login</p>}</div> );}Outra coisa comum é utilizar o && para renderizar condicionalmente um elemento:
function App() { return <div>{isLoggedIn && <p>Bem vindo, usuário!</p>}</div>;}Curiosidade:
O que vai ser renderizado?
function App() { return <div>{false}</div>;}function App() { return <div>{null}</div>;}function App() { return <div>{undefined}</div>;}function App() { return <div>{"false"}</div>;}function App() { return <div>{{ nome: "Ícaro", empresa: "Codante" }}</div>;}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.
function App() { const frutas = ["banana", "maçã", "laranja"];
return <div>{frutas}</div>;}Essa funcionalidade é bastante poderosa, pois você pode criar listas de elementos dinamicamente, utilizando o map para iterar sobre o array.
function App() { const frutas = ["banana", "maçã", "laranja"];
return ( <ul> {frutas.map((fruta) => ( <li>{fruta}</li> ))} </ul> );}Você pode chamar funções no meio do JSX, desde que elas retornem um valor válido.
function digaOi(nome) { return `Olá ${nome}`;}
function App() { return <div>{digaOi("Ícaro")}</div>;}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.