Ho bisogno di aggiungere una classe dinamica a un elenco di classi regolari, ma non ho idea di come (sto usando babel), qualcosa del genere:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
Qualche idea?
Ho bisogno di aggiungere una classe dinamica a un elenco di classi regolari, ma non ho idea di come (sto usando babel), qualcosa del genere:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
Qualche idea?
Risposte:
Puoi farlo, JavaScript normale:
className={'wrapper searchDiv ' + this.state.something}
o la versione del modello di stringa, con i backtick:
className={`wrapper searchDiv ${this.state.something}`}
Entrambi i tipi sono ovviamente solo JavaScript, ma il primo modello è quello tradizionale.
Ad ogni modo, in JSX, tutto ciò che è racchiuso tra parentesi graffe viene eseguito come JavaScript, quindi puoi praticamente fare tutto ciò che vuoi lì. Ma la combinazione di stringhe JSX e parentesi graffe non è necessaria per gli attributi.
element.classList.add("my-class")
; pertanto consentendo:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' '
Questo non funziona Qualcuno può dire perché?
A seconda di quante classi dinamiche devi aggiungere man mano che il tuo progetto cresce, probabilmente vale la pena dare un'occhiata all'utility classnames di JedWatson su GitHub. Ti consente di rappresentare le tue classi condizionali come oggetto e restituisce quelle che valutano come vere.
Quindi, come esempio dalla sua documentazione di 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>;
}
Poiché React innesca un nuovo rendering in caso di cambio di stato, i nomi delle classi dinamiche vengono gestiti in modo naturale e aggiornati con lo stato del componente.
Ecco la migliore opzione per Dynamic className, fai solo un po 'di concatenazione come facciamo in Javascript.
className={
"badge " +
(this.state.value ? "badge-primary " : "badge-danger ") +
" m-4"
}
Se hai bisogno di nomi di stile che dovrebbero apparire in base alla condizione dello stato, preferisco usare questa costruzione:
<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>
prova questo usando gli hook:
const [dynamicClasses, setDynamicClasses] = React.useState([
"dynamicClass1", "dynamicClass2
]);
e aggiungilo all'attributo className:
<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>
per aggiungere classe:
const addClass = newClass => {
setDynamicClasses([...dynamicClasses, newClass])
}
per eliminare la classe:
const deleteClass= classToDelete => {
setDynamicClasses(dynamicClasses.filter(class = > {
class !== classToDelete
}));
}
Puoi usare questo pacchetto npm. Gestisce tutto e ha opzioni per classi statiche e dinamiche basate su una variabile o una funzione.
// 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})} />
getBadgeClasses() {
let classes = "badge m-2 ";
classes += (this.state.count === 0) ? "badge-warning" : "badge-primary";
return classes;
}
<span className={this.getBadgeClasses()}>Total Count</span>
className={css(styles.mainDiv, 'subContainer')}
Questa soluzione è provata e testata in React SPFx.
Aggiungi anche la dichiarazione di importazione:
import { css } from 'office-ui-fabric-react/lib/Utilities';