Renderização condicional
Um visitante logado vê um painel de controle, um visitante não logado vê um formulário de login, e uma requisição que falhou precisa mostrar uma mensagem de erro em algum lugar da página. Um booleano como isLoggedIn normalmente fica em state, e o que muda é qual pedaço de UI é renderizado de acordo com seu valor atual. JSX é JavaScript, então decidir o que renderizar funciona da mesma forma que qualquer outra decisão no seu código: uma expressão que escolhe um valor, avaliada ali mesmo dentro da instrução return.
Escolhendo entre dois elementos com ternário
Quando existem exatamente duas coisas que um pedaço de UI poderia ser, o operador ternário escolhe entre elas:
return (
<div>
{isLoggedIn ? <Dashboard /> : <Login />}
{hasError && <p>Algo deu errado</p>}
</div>
)isLoggedIn ? <Dashboard /> : <Login /> se lê como qualquer outro ternário: se isLoggedIn é verdadeiro, essa expressão avalia para <Dashboard />, caso contrário avalia para <Login />. Seja qual for o resultado avaliado, ele é renderizado naquele local do JSX. As chaves são o que permite você colocar uma expressão JavaScript no meio da marcação, e um ternário é uma expressão como qualquer outra.
Mostrando ou ocultando um elemento com &&
A segunda linha lida com um tipo diferente de decisão: mostrar algo, ou mostrar nada. hasError && <p>Algo deu errado</p> usa o operador && do jeito que ele funciona em qualquer outro lugar do JavaScript. Se hasError é false, && avalia rapidamente e toda a expressão avalia para false, sem nunca chegar ao JSX à direita. Se hasError é true, a expressão avalia para o elemento <p>.
O motivo pelo qual isso é renderizado corretamente tem a ver com o que React faz com o resultado. React pula renderizar qualquer coisa para false, null e undefined, então quando hasError é false, nada aparece na página.
A pegadinha dos valores falsy
&& não produz apenas true ou false. Como qualquer expressão JavaScript usando &&, ela avalia para o lado em que termina, e esse lado pode ser qualquer valor, não necessariamente um booleano. Na maioria das vezes isso é inofensivo, mas vira um bug quando o lado esquerdo é um número:
{count && <Badge />}
// count = 0 → renderiza "0" na páginaSe count é 0, essa expressão avalia para 0. React pula renderizar para false, null e undefined, mas 0 é um valor real e renderizável, então React coloca na página. O badge não aparece, mas um 0 solto aparece, bem onde você esperava nada.
A solução é garantir que o lado esquerdo de && sempre seja um booleano de verdade:
{count > 0 && <Badge />}
// count = 0 → renderiza nadacount > 0 sempre avalia para true ou false, então a expressão renderiza o badge ou renderiza nada, sem nenhum 0 deixado para trás.
Não renderizar nada
Às vezes um componente não tem nada para mostrar, e a forma mais clara de dizer isso é retornar cedo:
function Banner({ message }) {
if (!message) {
return null
}
return <p className="banner">{message}</p>
}Quando message está vazio, a função retorna null antes de construir o resto do JSX. Isso mantém o return principal focado no caso onde realmente há algo para renderizar, em vez de envolver tudo em uma condição a mais.
&& mostra um elemento ou mostra nada, e retornar null de um componente é como você diz "não há nada para renderizar aqui." Fique atento a {count && <Badge />} quando count pode ser 0, já que 0 é um valor que React vai realmente imprimir. Escrever {count > 0 && <Badge />} em vez disso mantém o lado esquerdo um verdadeiro booleano. Próximo: Formulários, onde você vai usar state para lidar com campos de entrada.

