Skip to content

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.