[ Web Proxy ]
URL:
Viewing: https://es.react.dev/learn/conditional-rendering [Back]  [Original]

Renderizado condicional React

Renderizado condicional

Tus componentes a menudo necesitarn mostrar diferentes cosas dependiendo de diferentes condiciones. En React, puedes renderizar JSX de forma condicional utilizando la sintaxis de JavaScript como las declaraciones if, && y los operadores ? :.

Aprenders

  • Cmo devolver distinto JSX dependiendo de una condicin
  • Cmo incluir o excluir condicionalmente un fragmento de JSX
  • Atajos de sintaxis condicional comunes que encontrars en las bases de cdigo de React

Devolucin condicional de JSX

Supongamos que tienes un componente PackingList que muestra varios Items, que pueden ser marcados como empaquetados o no:

App.js
Reiniciar
function Item({ name, isPacked }) {
  return <li className="item">{name}</li>;
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms

Observa que algunos de los componentes Item tienen su prop isPacked asignada a true en lugar de false. Se desea aadir una marca de verificacin () a los elementos empaquetados si isPacked={true}.

Puedes escribir esto como una declaracin if/else as:

if (isPacked) {
return <li className="item">{name} </li>;
}
return <li className="item">{name}</li>;

Si la prop isPacked es true, este cdigo devuelve un rbol JSX diferente. Con este cambio, algunos de los elementos obtienen una marca de verificacin al final:

App.js
Reiniciar
function Item({ name, isPacked }) {
  if (isPacked) {
    return <li className="item">{name} </li>;
  }
  return <li className="item">{name}</li>;
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms

Prueba a editar lo que se devuelve en cualquiera de los dos casos y observa cmo cambia el resultado.

Observa cmo ests creando una lgica de ramificacin con las sentencias if y return de JavaScript. En React, el flujo de control (como las condiciones) es manejado por JavaScript.

Devolucin de nada con null

En algunas situaciones, no querrs mostrar nada en absoluto. Por ejemplo, digamos que no quieres mostrar elementos empaquetados en absoluto. Un componente debe devolver algo. En este caso, puedes devolver null:

if (isPacked) {
return null;
}
return <li className="item">{name}</li>;

Si isPacked es verdadero, el componente no devolver nada, null. En caso contrario, devolver JSX para ser renderizado.

App.js
Reiniciar
function Item({ name, isPacked }) {
  if (isPacked) {
    return null;
  }
  return <li className="item">{name}</li>;
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms

En la prctica, devolver null en un componente no es comn porque podra sorprender a un desarrollador que intente renderizarlo. Lo ms frecuente es incluir o excluir condicionalmente el componente en el JSX del componente padre. Aqu se explica cmo hacerlo.

Exclusin condicional de JSX

En el ejemplo anterior, controlabas qu rbol JSX (si es que haba alguno) era devuelto por el componente. Es posible que ya hayas notado alguna duplicacin en la salida de la renderizacin:

<li className="item">{name} </li>

es muy similar a

<li className="item">{name}</li>

Ambas ramas condicionales devuelven <li className="item">...</li>:

if (isPacked) {
return <li className="item">{name} </li>;
}
return <li className="item">{name}</li>;

Aunque esta duplicacin no es perjudicial, podra hacer que tu cdigo sea ms difcil de mantener. Qu pasa si quieres cambiar el className? Tendras que hacerlo en dos lugares en tu cdigo! En tal situacin, podras incluir condicionalmente un poco de JSX para hacer tu cdigo ms DRY.

Operador condicional (ternario) (? :)

JavaScript tiene una sintaxis compacta para escribir una expresin condicional el operador condicional u operador ternario.

En lugar de esto:

if (isPacked) {
return <li className="item">{name} </li>;
}
return <li className="item">{name}</li>;

Puedes escribir esto:

return (
<li className="item">
{isPacked ? name + ' ' : name}
</li>
);

Puedes leerlo como si isPacked es verdadero, entonces (?) renderiza name + ' ', de lo contrario (:) renderiza name)

Profundizar

Son estos dos ejemplos totalmente equivalentes?

Mostrar detalles

Si vienes de un entorno de programacin orientada a objetos, podras asumir que los dos ejemplos anteriores son sutilmente diferentes porque uno de ellos puede crear dos instancias diferentes de <li>. Pero los elementos JSX no son instancias porque no contienen ningn estado interno y no son nodos reales del DOM. Son descripciones ligeras, como los planos. As que estos dos ejemplos, de hecho, son completamente equivalentes. En Preservar y reiniciar el estado se explica en detalle cmo funciona esto.

Ahora digamos que quieres envolver el texto del elemento completado en otra etiqueta HTML, como <del> para tacharlo. Puedes aadir an ms lneas nuevas y parntesis para que sea ms fcil anidar ms JSX en cada uno de los casos:

App.js
Reiniciar
function Item({ name, isPacked }) {
  return (
    <li className="item">
      {isPacked ? (
        <del>
          {name + ' '}
        </del>
      ) : (
        name
      )}
    </li>
  );
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms

Este estilo funciona bien para condiciones simples, pero utilzalo con moderacin. Si tus componentes se desordenan con demasiado marcado condicional anidado, considera la posibilidad de extraer componentes hijos para limpiar las cosas. En React, el marcado es una parte de tu cdigo, por lo que puedes utilizar herramientas como variables y funciones para ordenar las expresiones complejas.

Operador lgico AND (&&)

Otro atajo comn que encontrars es el operador lgico AND (&&) de JavaScript. Dentro de los componentes de React, a menudo surge cuando quieres renderizar algn JSX cuando la condicin es verdadera, o no renderizar nada en caso contrario. Con &&, podras renderizar condicionalmente la marca de verificacin slo si isPacked es true:

return (
<li className="item">
{name} {isPacked && ''}
</li>
);

Puedes leer esto como si isPacked, entonces (&&) renderiza la marca de verificacin, si no, no renderiza nada.

Aqu est en accin:

App.js
Reiniciar
function Item({ name, isPacked }) {
  return (
    <li className="item">
      {name} {isPacked && ''}
    </li>
  );
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms

Una expresin JavaScript && devuelve el valor de su lado derecho (en nuestro caso, la marca de verificacin) si el lado izquierdo (nuestra condicin) es true. Pero si la condicin es false, toda la expresin se convierte en false. React considera false como un agujero en el rbol JSX, al igual que null o undefined, y no renderiza nada en su lugar.

Atencin

No pongas nmeros a la izquierda de &&.

Para comprobar la condicin, JavaScript convierte el lado izquierdo en un booleano automticamente. Sin embargo, si el lado izquierdo es 0, entonces toda la expresin obtiene ese valor (0), y React representar felizmente 0 en lugar de nada.

Por ejemplo, un error comn es escribir cdigo como messageCount && <p>New messages</p>. Es fcil suponer que no renderiza nada cuando messageCount es 0, pero en realidad renderiza el propio 0.

Para arreglarlo, haz que el lado izquierdo sea un booleano: messageCount > 0 && <p>New messages</p>.

Asignacin condicional de JSX a una variable

Cuando los atajos se interpongan en el camino de la escritura de cdigo simple, prueba a utilizar una sentencia if y una variable. Puedes reasignar las variables definidas con let, as que empieza proporcionando el contenido por defecto que quieres mostrar, el nombre:

let itemContent = name;

Utiliza una sentencia if para reasignar una expresin JSX a itemContent si isPacked es true:

if (isPacked) {
itemContent = name + " ";
}

Las llaves abren la ventana a JavaScript. Inserta la variable con llaves en el rbol JSX devuelto, anidando la expresin previamente calculada dentro de JSX:

<li className="item">
{itemContent}
</li>

Este estilo es el ms verboso, pero tambin el ms flexible. Aqu est en accin:

App.js
Reiniciar
function Item({ name, isPacked }) {
  let itemContent = name;
  if (isPacked) {
    itemContent = name + " ";
  }
  return (
    <li className="item">
      {itemContent}
    </li>
  );
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms

Como antes, esto funciona no slo para el texto, sino tambin para JSX arbitrario:

App.js
Reiniciar
function Item({ name, isPacked }) {
  let itemContent = name;
  if (isPacked) {
    itemContent = (
      <del>
        {name + " "}
      </del>
    );
  }
  return (
    <li className="item">
      {itemContent}
    </li>
  );
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms

Si no ests familiarizado con JavaScript, esta variedad de estilos puede parecer abrumadora al principio. Sin embargo, aprenderlos te ayudar a leer y escribir cualquier cdigo JavaScript y no slo los componentes de React! Escoge el que prefieras para empezar, y luego vuelve a consultar esta referencia si olvidas cmo funcionan los dems.

Recapitulacin

  • En React, se controla la lgica de ramificacin con JavaScript.
  • Puedes devolver una expresin JSX condicionalmente con una sentencia if.
  • Puedes guardar condicionalmente algn JSX en una variable y luego incluirlo dentro de otro JSX usando las llaves.
  • En JSX, {cond ? <A /> : <B />} significa si cond, renderiza <A />, si no <B />.
  • En JSX, {cond && <A />} significa si cond, renderiza <A />, si no, nada.
  • Los atajos son comunes, pero no tienes que usarlos si prefieres el simple if.
1. Mostrar un icono para los elementos incompletos con ? : 2. Mostrar la importancia del elemento con && 3. Refactorizar una serie de ? : a if y variables

Desafo 1 de 3:
Mostrar un icono para los elementos incompletos con ? :

Utiliza el operador condicional (cond ? a : b) para renderizar un si isPacked no es true.

App.js
Reiniciar
function Item({ name, isPacked }) {
  return (
    <li className="item">
      {name} {isPacked && ''}
    </li>
  );
}

export default function PackingList() {
  return (
    <section>
      <h1>Lista de equipaje de Sally Ride</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="Traje de vuelo" 
        />
        <Item 
          isPacked={true} 
          name="Casco con dorado a la hoja" 
        />
        <Item 
          isPacked={false} 
          name="Fotografa de Tam" 
        />
      </ul>
    </section>
  );
}

Mostrar ms
Mostrar solucinPrximo desafo

Web Proxy Viewer  |  New URL  |  Original Page