¿Cómo incluyo opcionalmente un elemento en JSX? Aquí hay un ejemplo usando un banner que debería estar en el componente si se ha pasado. Lo que quiero evitar es tener que duplicar las etiquetas HTML en la instrucción if.
render: function () {
var banner;
if (this.state.banner) {
banner = <div id="banner">{this.state.banner}</div>;
} else {
banner = ?????
}
return (
<div id="page">
{banner}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
javascript
reactjs
react-jsx
Jack Allan
fuente
fuente
else
rama? ¿Funciona eso? No estoy familiarizado con jsx ...Respuestas:
Simplemente deje el banner como indefinido y no se incluye.
fuente
null
Funciona tan bien comoundefined
? ¿También es esa parte de la especificación que funciona de esta manera y por lo tanto no es probable que se rompa en el futuro?¿Qué hay de esto? Definamos un
If
componente de ayuda simple .Y úsalo de esta manera:
ACTUALIZACIÓN: a medida que mi respuesta se está volviendo popular, me siento obligado a advertirle sobre el mayor peligro relacionado con esta solución. Como se señaló en otra respuesta, el código dentro del
<If />
componente se ejecuta siempre independientemente de si la condición es verdadera o falsa. Por lo tanto, el siguiente ejemplo fallará en caso de quebanner
seanull
(tenga en cuenta el acceso a la propiedad en la segunda línea):Tienes que tener cuidado cuando lo usas. Sugiero leer otras respuestas para enfoques alternativos (más seguros).
ACTUALIZACIÓN 2: Mirando hacia atrás, este enfoque no solo es peligroso sino también desesperadamente engorroso. Es un ejemplo típico de cuando un desarrollador (yo) intenta transferir patrones y enfoques que conoce de un área a otra, pero realmente no funciona (en este caso, otros lenguajes de plantilla).
Si necesita un elemento condicional, hágalo así:
Si también necesita la rama else, solo use un operador ternario:
Es mucho más corto, más elegante y seguro. Lo uso todo el tiempo. La única desventaja es que no se puede
else if
ramificar tan fácilmente, pero eso no suele ser tan común.De todos modos, esto es posible gracias a cómo funcionan los operadores lógicos en JavaScript. Los operadores lógicos incluso permiten pequeños trucos como este:
fuente
ReactElement
<span>
o<div>
.Personalmente, realmente creo que las expresiones ternarias que se muestran en ( JSX In Depth ) son la forma más natural que se ajusta a los estándares ReactJs.
Ver el siguiente ejemplo. Es un poco desordenado a primera vista, pero funciona bastante bien.
fuente
También puedes escribirlo como
Si
state.banner
esnull
oundefined
, se omite el lado derecho de la condición.fuente
El
If
componente de estilo es peligroso porque el bloque de código siempre se ejecuta independientemente de la condición. Por ejemplo, esto causaría una excepción nula sibanner
esnull
:Otra opción es usar una función en línea (especialmente útil con sentencias else):
Otra opción de los problemas de reacción :
fuente
&& + código-estilo + componentes pequeños
Esta simple sintaxis de prueba + convención de estilo de código + pequeños componentes enfocados es para mí la opción más legible que existe. Solo necesita tener especial cuidado con los valores falsos como
false
,0
o""
.hacer notación
La sintaxis de notación do7 stage-0 de ES7 también es muy buena y definitivamente la usaré cuando mi IDE lo admita correctamente:
Más detalles aquí: ReactJs - Crear un componente "If" ... ¿una buena idea?
fuente
short-circuit syntax
Simple, crea una función.
Este es un patrón que yo personalmente sigo todo el tiempo. Hace que el código sea realmente limpio y fácil de entender. Además, le permite refactorizar
Banner
en su propio componente si se vuelve demasiado grande (o se reutiliza en otros lugares).fuente
La
do
sintaxis experimental de ES7 lo hace fácil. Si está utilizando Babel, habilite laes7.doExpressions
función y luego:Ver http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions
fuente
Como ya se mencionó en las respuestas, JSX le presenta dos opciones
Operador ternario
{ this.state.price ? <div>{this.state.price}</div> : null }
Conjunción lógica
{ this.state.price && <div>{this.state.price}</div> }
Sin embargo, esos no funcionan
price == 0
.JSX representará la rama falsa en el primer caso y en caso de conjunción lógica, no se representará nada. Si la propiedad puede ser 0, solo use sentencias if fuera de su JSX.
fuente
typeof(this.state.price) === "number"
como condición (en cualquiera de las variantes).Este componente funciona cuando tiene más de un elemento dentro de la rama "if":
Uso:
Ps alguien piensa que estos componentes no son buenos para la lectura de código. Pero en mi opinión, HTML con JavaScript es peor
fuente
La mayoría de los ejemplos son con una línea de "html" que se representa condicionalmente. Esto parece legible para mí cuando tengo varias líneas que deben representarse condicionalmente.
El primer ejemplo es bueno porque en lugar de
null
que podamos renderizar condicionalmente algún otro contenido como{this.props.showContent ? content : otherContent}
Pero si solo necesita mostrar / ocultar contenido, esto es aún mejor ya que se ignoran los valores booleanos, nulos e indefinidos
fuente
Hay otra solución, si componente para React :
fuente
Utilizo un acceso directo más explícito: una expresión de función invocada inmediatamente (IIFE):
fuente
Hice https://www.npmjs.com/package/jsx-control-statements para que sea un poco más fácil, básicamente le permite definir
<If>
condicionales como etiquetas y luego las compila en ifs ternarios para que el código dentro del<If>
único se obtenga ejecutado si la condición es verdadera.fuente
También hay una versión realmente limpia de una línea ... {this.props.product.title || "Sin título" }
Es decir:
fuente
Hice https://github.com/ajwhite/render-if recientemente para representar elementos de forma segura solo si el predicado pasa .
o
fuente
Puede incluir elementos condicionalmente utilizando el operador ternario de esta manera:
fuente
Puede usar una función y devolver el componente y mantener delgada la función de renderizado
fuente
Aquí está mi enfoque usando ES6.
Demostración: http://jsfiddle.net/kb3gN/16688/
Estoy usando un código como:
Eso rendirá
SomeElement
solo siopened
es cierto. Funciona debido a la forma en que JavaScript resuelve las condiciones lógicas:Como
React
ignoraréfalse
, considero que es una muy buena forma de renderizar condicionalmente algunos elementos.fuente
Tal vez ayude a alguien que se encuentre con la pregunta: todas las representaciones condicionales en React Es un artículo sobre todas las diferentes opciones para la representación condicional en React.
Conclusiones clave sobre cuándo usar qué representación condicional:
** if-else
** operador ternario
** operador lógico &&
** caja de interruptor
** enumeraciones
** representaciones condicionales anidadas / multinivel
** HOC
** componentes de plantillas externas
fuente
Con ES6 puedes hacerlo con una simple línea
"show" es un booleano y usas esta clase por
fuente
No creo que esto haya sido mencionado. Esta es como su propia respuesta, pero creo que es aún más simple. Siempre puede devolver cadenas de las expresiones y puede anidar jsx dentro de las expresiones, por lo que esto permite una expresión en línea fácil de leer.
fuente
Me gusta lo explícito de las expresiones de función invocadas inmediatamente (
IIFE
) yif-else
overrender callbacks
andternary operators
.Solo necesita familiarizarse con la
IIFE
sintaxis,{expression}
es la sintaxis React habitual, en su interior solo considere que está escribiendo una función que se invoca a sí misma.que necesitan ser envueltos dentro de parens
fuente
También hay una técnica que utiliza accesorios de renderizado para renderizar condicionalmente un componente. Su beneficio es que el render no se evaluaría hasta que se cumpla la condición, lo que no genera preocupaciones por valores nulos e indefinidos .
fuente
Cuando tenga que representar solo algo si se cumple la condición aprobada, puede usar la sintaxis:
El código de esta manera se vería así:
Por supuesto, hay otras formas válidas de hacer esto, todo depende de las preferencias y la ocasión. ¡Puedes aprender más formas sobre cómo hacer renderizado condicional en React en este artículo si estás interesado!
fuente
Solo para agregar otra opción: si le gusta / tolera coffee-script, puede usar coffee-react para escribir su JSX, en cuyo caso las declaraciones if / else son utilizables, ya que son expresiones en coffee-script y no declaraciones:
fuente
Solo para extender la respuesta de @Jack Allan con referencias a documentos.
La documentación básica de React (inicio rápido) sugiere
null
en tal caso. Sin embargo, los booleanos, nulos e indefinidos también se ignoran, como se menciona en la guía avanzada.fuente