¿Qué hay de esto? Definamos un If
componente de ayuda simple .
var If = React.createClass({
render: function() {
if (this.props.test) {
return this.props.children;
}
else {
return false;
}
}
});
Y úsalo de esta manera:
render: function () {
return (
<div id="page">
<If test={this.state.banner}>
<div id="banner">{this.state.banner}</div>
</If>
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
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 que banner
sea null
(tenga en cuenta el acceso a la propiedad en la segunda línea):
<If test={this.state.banner}>
<div id="banner">{this.state.banner.url}</div>
</If>
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í:
render: function () {
return (
<div id="page">
{this.state.banner &&
<div id="banner">{this.state.banner}</div>}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
Si también necesita la rama else, solo use un operador ternario:
{this.state.banner ?
<div id="banner">{this.state.banner}</div> :
<div>There is no banner!</div>
}
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:
<h3>{this.state.banner.title || 'Default banner title'}</h3>
else
rama? ¿Funciona eso? No estoy familiarizado con jsx ...