Menu

Renderizado condicional en React: if, ternario, && y null

El renderizado condicional en React es JavaScript normal: un if, un ternario o && deciden qué JSX devuelve un componente. Aprende cada patrón, el 0 suelto que puede imprimir &&, devolver null, y por qué ocultar un componente no es lo mismo que no renderizarlo.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

El renderizado condicional en React significa elegir lo que devuelve un componente con JavaScript normal: una sentencia if antes del return, un ternario cond ? a : b dentro del JSX, o cond && <Thing /> para mostrar algo o nada. No hay ninguna sintaxis de plantillas especial que aprender.

Haz clic en el botón y cambian tanto el mensaje como la etiqueta, porque cada ternario elige una cadena distinta en el siguiente renderizado. Cambia useState(false) por useState(true) y la vista previa empieza con la sesión iniciada.

Sentencias if y returns tempranos

Las llaves de JSX aceptan expresiones, no sentencias, así que no puedes escribir {if (x) ...} dentro del marcado. Puedes escribir cualquier if que quieras antes del return. Cuando todo un estado del componente se ve distinto (cargando, error, vacío), haz un return temprano para cada caso y deja el marcado principal para el caso normal.

Cada botón pone la bandeja de entrada en un estado distinto, y cada estado tiene su propia rama corta y legible. Los returns tempranos dejan el camino principal al final sin anidar.

Ternarios dentro de JSX

Cuando solo cambia una parte pequeña del marcado, un ternario en línea la mantiene junta: {isOpen ? <CloseIcon /> : <MenuIcon />}. Los ternarios funcionan bien para dos opciones. Los ternarios anidados para tres o más se vuelven difíciles de leer rápidamente:

// Hard to follow
{status === 'loading' ? <Spinner /> : status === 'error' ? <ErrorBox /> : <List />}

Cuando veas eso, mueve la lógica a una cadena de if antes del return (como arriba) o a un mapa de objetos (más abajo).

&& y el 0 suelto

cond && <Thing /> renderiza <Thing /> cuando cond es truthy y nada cuando es false. Funciona porque && devuelve su lado izquierdo cuando ese lado es falsy, y React no renderiza nada para false, null y undefined.

La trampa es que 0 también es falsy, y React sí renderiza números. Así que count && <Badge /> con un contador en 0 pone un 0 literal en la página.

Sin mensajes sin leer, la primera línea dice "Broken: 0" mientras que la segunda no muestra nada después de "Fixed:". Haz clic en New message y ambas coinciden; haz clic en Mark all read y el 0 vuelve. La solución es darle a && un booleano real: unread > 0, items.length > 0 o Boolean(unread). Una cadena vacía '' tiene en principio el mismo problema, pero no se ve nada al renderizarla, así que rara vez lo notas.

Devolver null

Un componente puede devolver null para no renderizar nada. Un aviso que solo aparece cuando hay algo de qué avisar es un buen ejemplo: el padre siempre renderiza <Warning /> y el componente decide.

Mira la consola: la función Warning registra en cada renderizado, incluidos los que devuelven null. Devolver null omite la salida, no el trabajo. Sus hooks y efectos se siguen ejecutando, así que si un componente es costoso o inicia algo (un temporizador, una suscripción), decide en el padre y no lo renderices en absoluto.

Guardar JSX en una variable

JSX es un valor, así que puedes asignarlo a una variable, construirlo con sentencias if y ponerlo en el marcado después. Esto ayuda cuando una pieza de un layout más grande depende de varias condiciones.

function Checkout({ cart, user }) {
    let action;
    if (!user) {
        action = <a href="/login">Log in to check out</a>;
    } else if (cart.length === 0) {
        action = <p>Your cart is empty.</p>;
    } else {
        action = <button>Pay now</button>;
    }

    return (
        <section>
            <h2>Your cart</h2>
            {action}
        </section>
    );
}

Elegir entre varios componentes con un objeto

Cuando la elección es "uno entre muchos", un objeto que asocia cada valor con un componente es más corto que una larga cadena de if o un switch, y agregar un caso es una línea.

TABS[tab] elige un componente y <Panel /> lo renderiza. La variable debe empezar con mayúscula: JSX trata <panel /> como una etiqueta HTML. Agrega una entrada notifications a TABS con su propio componente y aparece un cuarto botón.

Ocultar no es lo mismo que no renderizar

Hay dos formas de hacer que algo desaparezca, y se comportan distinto. show && <Counter /> quita el componente del árbol cuando show es false. React lo desmonta y descarta su estado, así que empieza de cero cuando vuelve. Ocultarlo con CSS (style={{ display: show ? 'block' : 'none' }}) lo mantiene montado, así que su estado sobrevive.

Haz clic en ambos contadores varias veces, desmarca la casilla y vuelve a marcarla. El primer contador vuelve a 0 y el segundo conserva su número. Ninguno está mal: quitar es lo correcto para un formulario que debe empezar vacío cada vez, ocultar es lo correcto para pestañas cuya posición de scroll o cuyo input se deben conservar. La página sobre renderizado explica cómo decide React que un componente es el mismo entre renderizados.

React 19.2 agrega una tercera opción, <Activity mode="hidden">, que oculta sus hijos y conserva su estado como hace CSS, y además limpia sus efectos hasta que se vuelven a mostrar.

Props y atributos condicionales

Las condiciones no solo deciden qué elementos aparecen. Cualquier prop puede recibir un valor calculado, así que un ternario o una comparación dentro de un atributo suele ser todo lo que necesitas:

<button disabled={!canSave} className={hasError ? 'field error' : 'field'}>
    Save
</button>
<input aria-invalid={hasError} placeholder={user ? user.email : 'you@example.com'} />

Cuando el valor de una prop es undefined, React omite el atributo por completo, lo que es una forma limpia de agregar un atributo solo a veces: title={isTruncated ? fullText : undefined}. Para atributos booleanos como disabled y checked, pasa true o false y React los agrega o los quita.

Condiciones en listas

Para dejar elementos fuera de una lista, filtra el array antes de mapearlo en lugar de devolver null desde dentro de map. items.filter((i) => i.done).map(...) se lee tal como lo que hace, y la página de listas y keys lo muestra en un ejemplo en funcionamiento.

Preguntas frecuentes

¿Cómo escribo un if dentro de JSX?

No puedes poner una sentencia if dentro de las llaves de JSX, porque las llaves aceptan expresiones. Usa un ternario (cond ? a : b) o && dentro del JSX, o ejecuta el if antes del return y guarda el JSX en una variable.

¿Por qué mi componente muestra un 0?

count && <Badge /> devuelve el propio count cuando es 0, y React renderiza el número 0. Haz que el lado izquierdo sea un booleano real: count > 0 && <Badge />.

¿Cómo no renderizo nada en React?

Devuelve null desde el componente, o pon null, undefined, false o true en el JSX. React no renderiza ninguno de ellos.

¿Un componente que devuelve null se sigue ejecutando?

Sí. Su función se ejecuta, sus hooks se ejecutan y sus efectos se disparan. Devolver null solo significa que no agrega nada a la página. Para saltarte todo el trabajo, no renderices el componente desde el padre.

¿Debo ocultar un componente con CSS o quitarlo?

Quitarlo (show && <Panel />) lo desmonta, así que su estado se descarta y empieza de cero la próxima vez. Ocultarlo con display: none lo mantiene montado y conserva su estado. Elige según si el estado debe sobrevivir.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR