Muszę dodać klasę dynamiczną do listy zwykłych klas, ale nie mam pojęcia, jak (używam babel), coś takiego:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
Jakieś pomysły?
Muszę dodać klasę dynamiczną do listy zwykłych klas, ale nie mam pojęcia, jak (używam babel), coś takiego:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
Jakieś pomysły?
Odpowiedzi:
Możesz to zrobić, zwykły JavaScript:
className={'wrapper searchDiv ' + this.state.something}
lub wersja szablonu napisów, z odwrotnymi znakami:
className={`wrapper searchDiv ${this.state.something}`}
Oba typy to oczywiście tylko JavaScript, ale pierwszy wzorzec jest typem tradycyjnym.
W każdym razie w JSX wszystko, co jest zawarte w nawiasach klamrowych, jest wykonywane jako JavaScript, więc możesz w zasadzie robić tam, co chcesz. Jednak łączenie ciągów JSX i nawiasów klamrowych nie jest rozwiązaniem dla atrybutów.
element.classList.add("my-class"); w związku z tym pozwalając na:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' 'To nie działa. Czy ktoś może powiedzieć, dlaczego?
W zależności od tego, ile dynamiczne zajęcia trzeba dodać jako projekt rośnie to chyba warto sprawdzić na classnames użyteczności przez JedWatson na GitHub. Umożliwia reprezentowanie klas warunkowych jako obiektu i zwraca te, które dają wartość true.
A więc jako przykład z dokumentacji Reacta:
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>;
}
Ponieważ React wyzwala ponowne renderowanie, gdy następuje zmiana stanu, dynamiczne nazwy klas są obsługiwane w naturalny sposób i aktualizowane zgodnie ze stanem komponentu.
Oto najlepsza opcja dla Dynamic className, po prostu zrób kilka konkatenacji, tak jak robimy to w Javascript.
className={
"badge " +
(this.state.value ? "badge-primary " : "badge-danger ") +
" m-4"
}
Jeśli potrzebujesz nazw stylów, które powinny pojawić się zgodnie ze stanem, wolę użyć tej konstrukcji:
<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>
spróbuj tego, używając haków:
const [dynamicClasses, setDynamicClasses] = React.useState([
"dynamicClass1", "dynamicClass2
]);
i dodaj to w atrybucie className:
<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>
dodać klasę:
const addClass = newClass => {
setDynamicClasses([...dynamicClasses, newClass])
}
aby usunąć zajęcia:
const deleteClass= classToDelete => {
setDynamicClasses(dynamicClasses.filter(class = > {
class !== classToDelete
}));
}
Możesz użyć tego pakietu npm. Obsługuje wszystko i ma opcje klas statycznych i dynamicznych opartych na zmiennej lub funkcji.
// 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')}
To rozwiązanie zostało wypróbowane i przetestowane w React SPFx.
Dodaj również instrukcję importu:
import { css } from 'office-ui-fabric-react/lib/Utilities';