Renderização condicional
Um visitante logado vê um dashboard, 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 geralmente fica no state, e o que muda é qual pedaço de UI é renderizado para 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 bem ali na declaração return.
Escolhendo entre dois elementos com um operador ternário
Quando há 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 /> lê-se igual a qualquer outro ternário: se isLoggedIn é verdadeiro, essa expressão avalia para <Dashboard />, caso contrário avalia para <Login />. Tudo que ela avalia fica renderizado naquele lugar no JSX. As chaves são o que deixa 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 uma forma diferente de decisão: mostrar algo ou não mostrar nada. hasError && <p>Algo deu errado</p> usa o operador && do jeito que funciona em qualquer outro lugar do JavaScript. Se hasError é false, && interrompe a avaliação e toda a expressão avalia para false, sem nunca chegar ao JSX da direita. Se hasError é true, a expressão avalia para o elemento <p>.
A razão disso renderizar corretamente depende do que React faz com o resultado. React não renderiza nada 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 não renderiza para false, null e undefined, mas 0 é um valor real e renderizável, então React o coloca na página. O badge não aparece, mas um 0 solto fica ali, bem onde você esperava nada.
A solução é garantir que o lado esquerdo de && é sempre 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 deixar nenhum 0 para trás.
Não renderizando 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 em que há algo realmente para renderizar, em vez de envolver tudo em mais uma condição.
&& mostra um elemento ou mostra nada, e retornar null de um componente é como você diz "não há nada para renderizar aqui". Cuidado com {count && <Badge />} quando count pode ser 0, já que 0 é um valor que React vai de fato imprimir. Escrever {count > 0 && <Badge />} em vez disso mantém o lado esquerdo um booleano de verdade.
Próximo: Formulários, onde você vai usar state para lidar com campos de entrada.

