Aplicar condicionalmente atributos de clase en React

Resuelto apexdodge asked hace 9 años • 24 respuestas

Quiero mostrar y ocultar condicionalmente este grupo de botones dependiendo de lo que se pasa desde el 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 el {this.props.showBulkActions ? 'show' : 'hidden'}. ¿Estoy haciendo algo mal aquí?

apexdodge avatar May 29 '15 22:05 apexdodge
Aceptado

Las llaves están dentro de la cadena, por lo que se evalúa como una cadena. Necesitan estar afuera, así que esto debería funcionar:

<div className={"btn-group pull-right " + (this.props.showBulkActions ? 'show' : 'hidden')}>

Tenga en cuenta el espacio después de "tirar a la derecha". No querrás proporcionar accidentalmente la clase "pull-rightshow" en lugar de "pull-right show". Además, los paréntesis deben estar ahí.

spitfire109 avatar May 29 '2015 15:05 spitfire109

Como han comentado otros, la utilidad classnames es el enfoque recomendado actualmente para manejar nombres de clases CSS condicionales en ReactJs.

En su caso, la solución se verá así:

var btnGroupClasses = classNames(
  'btn-group',
  'pull-right',
  {
    'show': this.props.showBulkActions,
    'hidden': !this.props.showBulkActions
  }
);

...

<div className={btnGroupClasses}>...</div>

Como nota al margen, le sugiero que intente evitar el uso de ambas clases showy hidden, para que el código pueda ser más simple. Lo más probable es que no necesites configurar una clase para que algo se muestre de forma predeterminada.

Anexo de 2021: para mejorar el rendimiento, puede considerar clsx como alternativa.

Diego V avatar Mar 01 '2016 09:03 Diego V

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:

<div className={`btn-group pull-right ${this.props.showBulkActions ? 'shown' : 'hidden'}`}>

Este enfoque le permite hacer cosas interesantes como esa, renderizando s-is-showno s-is-hidden:

<div className={`s-${this.props.showBulkActions ? 'is-shown' : 'is-hidden'}`}>
Bertrand avatar Sep 05 '2016 13:09 Bertrand