Quiero mostrar y ocultar condicionalmente este grupo de botones dependiendo de lo que se pasa del componente principal que se ve así:
<TopicNav showBulkActions={this.__hasMultipleSelected} />
....
__hasMultipleSelected: function() {
return false; //return true or false depending on data
}
....
var TopicNav = React.createClass({
render: function() {
return (
<div className="row">
<div className="col-lg-6">
<div className="btn-group pull-right {this.props.showBulkActions ? 'show' : 'hidden'}">
<button type="button" className="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Bulk Actions <span className="caret"></span>
</button>
<ul className="dropdown-menu" role="menu">
<li><a href="#">Merge into New Session</a></li>
<li><a href="#">Add to Existing Session</a></li>
<li className="divider"></li>
<li><a href="#">Delete</a></li>
</ul>
</div>
</div>
</div>
);
}
});
Sin embargo, no pasa nada con las {this.props.showBulkActions? 'show': 'oculto'}. ¿Estoy haciendo algo mal aquí?
Respuestas:
Las llaves están dentro de la cadena, por lo que se evalúa como cadena. Necesitan estar afuera, así que esto debería funcionar:
Tenga en cuenta el espacio después de "pull-right". No desea proporcionar accidentalmente la clase "pull-rightshow" en lugar de "pull-right show". También los paréntesis deben estar allí.
fuente
classnames
podría no ser apropiado. Si está en surender
función y tiene unamap
, es posible que solo sepa si desea agregar una clase en el momento en que la está procesando, por lo que esta respuesta es bastante útil para eso.this.props.showBulkActions ? 'btn-group pull-right show' : 'btn-group pull-right hidden')
. No es elegante pero funciona.Como otros han comentado, la utilidad de nombres de clase es el enfoque actualmente recomendado para manejar nombres de clases CSS condicionales en ReactJs.
En su caso, la solución se verá así:
...
Como nota al margen, le sugiero que intente evitar usar ambos
show
y lashidden
clases, por lo que el código podría ser más simple. Lo más probable es que no necesite establecer una clase para que algo se muestre de forma predeterminada.fuente
classNames
en este momento?Si está utilizando un transpilador (como Babel o Traceur), puede utilizar las nuevas " cadenas de plantilla " de ES6 .
Aquí está la respuesta de @ spitfire109, modificada en consecuencia:
Este enfoque le permite hacer cosas ordenadas como esa, representando
s-is-shown
os-is-hidden
:fuente
s-is-shown
o estás-is-hidden
en la base de código, no encontrará este código.Puede usar aquí los literales de cadena
fuente
Gastando en la buena respuesta de @ spitfire109, uno podría hacer algo como esto:
y luego dentro de la función render:
mantiene el jsx corto
fuente
O use npm classnames . Es muy fácil y útil especialmente para construir la lista de clases.
fuente
En caso de que solo necesite un nombre de clase opcional:
fuente
false
clase cuando la condición falle.Puede usar matrices ES6 en lugar de nombres de clase. La respuesta se basa en el artículo del Dr. Axel Rauschmayer: Agregar condicionalmente entradas dentro de Array y literales de objeto .
fuente
2019:
Reaccionar es un lago con muchas utilidades. Pero no necesitas ningún
npm
paquete para eso. simplemente cree en algún lugar la funciónclassnames
y llámela cuando lo necesite;o
ejemplo
Solo por inspiración
declarar elemento auxiliar y usarlo
toggle
método(DOMTokenList)classList.toggle(class,condition)
ejemplo:
fuente
Solución más elegante, que es mejor para el mantenimiento y la legibilidad:
fuente
puedes usar esto:
fuente
Esto funcionaría para ti
fuente
Puede usar este paquete npm. Maneja todo y tiene opciones para clases estáticas y dinámicas basadas en una variable o una función.
fuente
Según el valor de
this.props.showBulkActions
usted, puede cambiar de clase dinámicamente de la siguiente manera.fuente
Me gustaría agregar que también puede usar un contenido variable como parte de la clase
El contexto es un chat entre un bot y un usuario, y los estilos cambian dependiendo del remitente, este es el resultado del navegador:
fuente
Esto es útil cuando tiene más de una clase para agregar. Puede unir todas las clases en una matriz con un espacio.
fuente
Reemplazar:
con:
fuente
Referencia a la respuesta de fuego de @split, podemos actualizarla con literales de plantilla, que es más legible. Para referencia Checkout javascript literal de plantilla
fuente
Encontré esto que explica cómo hacerlo con un ternario y con la Biblioteca de nombres de clase
fuente