Jestem nowy w ReactJS i JSX i mam mały problem z poniższym kodem.
Próbuję dodać wiele klas do className
atrybutu na każdym li
:
<li key={index} className={activeClass, data.class, "main-class"}></li>
Mój komponent React to:
var AccountMainMenu = React.createClass({
getInitialState: function() {
return { focused: 0 };
},
clicked: function(index) {
this.setState({ focused: index });
},
render: function() {
var self = this;
var accountMenuData = [
{
name: "My Account",
icon: "icon-account"
},
{
name: "Messages",
icon: "icon-message"
},
{
name: "Settings",
icon: "icon-settings"
}
/*{
name:"Help & Support <span class='font-awesome icon-support'></span>(888) 664.6261",
listClass:"no-mobile last help-support last"
}*/
];
return (
<div className="acc-header-wrapper clearfix">
<ul className="acc-btns-container">
{accountMenuData.map(function(data, index) {
var activeClass = "";
if (self.state.focused == index) {
activeClass = "active";
}
return (
<li
key={index}
className={activeClass}
onClick={self.clicked.bind(self, index)}
>
<a href="#" className={data.icon}>
{data.name}
</a>
</li>
);
})}
</ul>
</div>
);
}
});
ReactDOM.render(<AccountMainMenu />, document.getElementById("app-container"));
javascript
css
reactjs
ecmascript-6
Zabijaka
źródło
źródło
classNames={{foo: true, bar: true, baz: false}}
iclassNames={["foo", "bar"]}
po prostu pracować ?Odpowiedzi:
Używam nazw klas, gdy do podjęcia decyzji o użyciu (nie) klas potrzebna jest logika. Zbyt prosty przykład :
To powiedziawszy, jeśli nie chcesz uwzględniać zależności, poniżej znajdziesz lepsze odpowiedzi.
źródło
import classNames from 'classnames'
należy go użyć w komponencieclassName={classNames(classes.myFirstClass, classes.mySecondClass)}
.var btnClass = classNames({ btn: true, 'btn-pressed': this.state.isPressed, 'btn-over': !this.state.isPressed && this.state.isHovered }); return <button className={btnClass}>{this.props.label}</button>;
Używam
ES6
literałów szablonów . Na przykład:A następnie po prostu renderuj:
Wersja jednowarstwowa:
źródło
<input className={`class1 ${class2}`}>
<input class=" form-control input-lg round-lg" />
. Zwróć uwagę na dodatkowe miejsce na początku. To jest poprawne, ale brzydkie. Nawet zareaguj FAQ zaleca inny sposób lub użycie pakietu nazw klasPo prostu użyj JavaScript.
Jeśli chcesz dodać klucze i wartości oparte na klasach w obiekcie, możesz użyć:
Lub jeszcze prościej:
źródło
className={['terra-Table', medOrder.resource.status]}
className={[listOfClasses].join(' ')}
, działa dla mnie dzięki!Concat
Nie musisz być fantazyjny Używam modułów CSS i jest to łatwe
Spowoduje to:
Innymi słowy, oba style
Warunkowe
Łatwo byłoby użyć tego samego pomysłu z if
źródło
className={
suwak $ {className? `$ {className}: ''}
}` `. Ale to dużo. [uwaga: „coś” + undefined = „coś niedostatecznie”. Dynamiczna konwersja Js.Można to osiągnąć za pomocą literałów szablonów ES6:
źródło
<input className={`${class1} ${class2}`}>
Możesz utworzyć element o wielu nazwach klas, taki jak ten:
Oczywiście możesz użyć łańcucha zawierającego nazwy klas i manipulować nim, aby zaktualizować nazwy klas elementu.
źródło
"
zamiast'
. Przepraszam za to.Oto jak możesz to zrobić za pomocą ES6:
Możesz wymienić wiele klas i warunków, a także możesz dołączyć klasy statyczne. Nie jest konieczne dodawanie dodatkowej biblioteki.
Powodzenia ;)
źródło
Vanilla JS
Nie potrzebujesz zewnętrznych bibliotek - po prostu użyj ciągów szablonów ES6 :
źródło
Może nazwy klas mogą ci pomóc.
źródło
Nie sądzę, że potrzebujemy zewnętrznego pakietu do dodawania wielu klas.
Ja osobiście korzystam
lub
drugi w przypadku, gdy musisz warunkowo dodać lub usunąć klasy.
źródło
Dodając, możemy odfiltrować puste ciągi.
źródło
Możesz utworzyć element o wielu nazwach klas takich jak ten, wypróbowałem je w obie strony, działa dobrze ...
Jeśli importujesz css, możesz postępować w następujący sposób: Sposób 1:
sposób 2:
**
Jeśli stosujesz css jako wewnętrzny:
źródło
Możesz wykonać następujące czynności:
Krótkie i proste rozwiązanie, mam nadzieję, że to pomoże.
źródło
Można to zrobić za pomocą https://www.npmjs.com/package/clsx :
https://www.npmjs.com/package/clsx
Najpierw zainstaluj:
Następnie zaimportuj go do pliku komponentu:
Następnie użyj zaimportowanej funkcji w swoim komponencie:
źródło
Późno na imprezę, ale po co używać strony trzeciej do tak prostego problemu?
Możesz to zrobić, jak wspomniał @Huw Davies - najlepszy sposób
Obie są dobre. Ale pisanie może stać się skomplikowane dla dużej aplikacji. Aby było to optymalne, robię to samo powyżej, ale umieszczam to w klasie pomocniczej
Korzystanie z mojej funkcji pomocnika pozwala mi oddzielić logikę do przyszłej edycji, a także daje mi wiele sposobów dodawania klas
lub
To jest moja funkcja pomocnika poniżej. Umieściłem go w pliku helper.js, w którym trzymam wszystkie moje powszechne metody. Będąc tak prostą funkcją, uniknąłem korzystania z zewnętrznych programów, aby zachować kontrolę
źródło
Możesz użyć tablic, a następnie połączyć je za pomocą spacji.
Spowoduje to:
źródło
Wiem, że to późna odpowiedź, ale mam nadzieję, że to komuś pomoże.
Weź pod uwagę, że zdefiniowałeś następujące klasy w pliku css „ primary ”, „ font-i ”, „ font-xl ”
zrobiłby lewę!
Aby uzyskać więcej informacji: https://www.youtube.com/watch?v=j5P9FHiBVNo&list=PLC3y8-rFHvwgg3vaYJgHGnModB54rxOk3&index=20
źródło
aby dodać więcej klas
źródło
Korzystanie TodoTextInput.js przykład Facebooka
zastąpienie nazw klas zwykłym waniliowym kodem js będzie wyglądać następująco:
źródło
Jeśli nie masz ochoty importować innego modułu, ta funkcja działa jak
classNames
moduł.Możesz użyć tego w następujący sposób:
źródło
function classNames(rules) { return Object.entries(rules) .reduce( (arr, [cls, flag]) => { if (flag) arr.push(cls); return arr }, [] ).join(" ") }
To jest to co robię:
Składnik:
Składnik wywołujący:
źródło
Korzystam z React 16.6.3 i @Material UI 3.5.1 i mogę używać tablic w className jak
className={[classes.tableCell, classes.capitalize]}
Tak więc w twoim przykładzie następujące byłyby podobne.
źródło
Skorzystaj z https://www.npmjs.com/package/classnames
import classNames z 'classnames';
Może korzystać z wielu klas za pomocą oddzielonych przecinków:
Może używać wielu klas, używając przecinków oddzielonych warunkiem:
Korzystanie z tablicy jako rekwizytów do classNames również będzie działać, ale ostrzega np
źródło
Używam pakietu rc-classnames .
Możesz dodawać klasy w dowolnym formacie (Array, Object, Argument). Wszystkie prawdziwe wartości z tablic lub argumentów plus klucze w obiektach równych
true
scaleniu.na przykład:
źródło
I
bind
classNames
do modułu css zaimportowanego do komponentu.classnames
daje możliwość deklarowaniaclassName
elementu React w sposób deklaratywny.dawny:
źródło
Zwykle używam tego w ten sposób: (w twoim przypadku)
Jeśli chodzi o JSX i (zwykle) mamy trochę json ... niż go zapętlisz ... komponent . map , a także niektóre warunkowe, aby sprawdzić, czy istnieje właściwość json, aby wyświetlić nazwę klasy w zależności od wartości właściwości z JSON. W poniższym przykładzie component_color i component_dark_shade są właściwościami z component.map ()
Wyjście:
<div class="component no-color light" ....
Lub: w<div class="component blue dark" ....
zależności od wartości z mapy ...źródło
Kiedy mam wiele różnych klas, uważam, że poniższe są przydatne.
Filtr usuwa dowolne
null
wartości, a sprzężenie umieszcza wszystkie pozostałe wartości w ciągu oddzielonym spacjami.źródło