| [ Web Proxy ] |
| Viewing: https://es.react.dev/learn/conditional-rendering | [Back] [Original] |
Fue til esta pgina?
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 ? :.
Supongamos que tienes un componente PackingList que muestra varios Items, que pueden ser marcados como empaquetados o no:
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> ); }
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:
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> ); }
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.
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.
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> ); }
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.
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.
? :) 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)
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:
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> ); }
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.
&&) 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:
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> ); }
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.
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>.
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:
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> ); }
Como antes, esto funciona no slo para el texto, sino tambin para JSX arbitrario:
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> ); }
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.
if.{cond ? <A /> : <B />} significa si cond, renderiza <A />, si no <B />.{cond && <A />} significa si cond, renderiza <A />, si no, nada.if.? : 2. Mostrar la importancia del elemento con && 3. Refactorizar una serie de ? : a if y variables ? : Utiliza el operador condicional (cond ? a : b) para renderizar un si isPacked no es true.
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> ); }
| Web Proxy Viewer | New URL | Original Page |