Je dois ajouter une classe dynamique à une liste de classes régulières, mais je ne sais pas comment (j'utilise babel), quelque chose comme ceci:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
Des idées?
Merci
Vous pouvez le faire, javascript normal:
className={'wrapper searchDiv ' + this.state.something}
ou la version du modèle de chaîne
className={`wrapper searchDiv ${this.state.something}`}
avec backticks.
Les deux types ne sont bien sûr que du javascript, mais le premier motif est le type traditionnel. Quoi qu'il en soit, dans JSX, tout ce qui est entre accolades est exécuté en javascript, ce qui vous permet de faire ce que vous voulez. Mais combiner les chaînes JSX et entre accolades est un non-aller pour les attributs.
En fonction du nombre de classes dynamiques à ajouter au fur et à mesure de la croissance de votre projet, il vaut probablement la peine de consulter le fichier classnames utility de JedWatson sur GitHub. Il vous permet de représenter vos classes conditionnelles sous forme d'objet et renvoie celles qui ont la valeur true.
Ainsi, à titre d'exemple, tiré de la documentation React:
render () {
var btnClass = classNames({
'btn': true,
'btn-pressed': this.state.isPressed,
'btn-over': !this.state.isPressed && this.state.isHovered
});
return <button className={btnClass}>I'm a button!</button>;
}
Étant donné que React déclenche un re-rendu en cas de changement d'état, vos noms de classes dynamiques sont gérés naturellement et mis à jour avec l'état de votre composant.
Une syntaxe simple possible sera:
<div className={`wrapper searchDiv ${this.state.something}`}>
Voici la meilleure option pour le nom de classe dynamique. Il suffit de faire une concaténation comme en Javascript.
className={
"badge " +
(this.state.value ? "badge-primary " : "badge-danger ") +
" m-4"
}
getBadgeClasses() {
let classes = "badge m-2 ";
classes += (this.state.count === 0) ? "badge-warning" : "badge-primary";
return classes;
}
<span className={this.getBadgeClasses()}>Total Count</span>
Si vous avez besoin de noms de style qui doivent apparaître en fonction de la condition d'état, je préfère utiliser cette construction:
<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>
Vous pouvez utiliser le paquet this npm. Il gère tout et propose des options pour les classes statiques et dynamiques basées sur une variable ou une fonction.
// Support for string arguments
getClassNames('class1', 'class2');
// support for Object
getClassNames({class1: true, class2 : false});
// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], {
class5 : function() { return false; },
class6 : function() { return true; }
});
<div className={getClassNames({class1: true, class2 : false})} />