javascript - ReactJS Bileşenine birden fazla sınıf nasıl eklenir?
Ben ReactJS ve JSX'e yeniyim ve aşağıdaki kodla ilgili küçük bir sorunum var.
Her li öğesindeki className özniteliğine birden fazla sınıf eklemeye çalışıyorum:
<li key={index} className={activeClass, data.class, "main-class"}></li>
React bileşenim şunlardır:
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"));
Cevap #1
Ben ES6 şablon dizelerini kullanıyorum. Örneğin:
const error = this.state.valid ? '' : 'error'
const classes = `form-control round-lg ${error}`
Ve sonra onu sadece render edin:
<input className={classes} />
Tek satırlık versiyon:
<input className={`form-control round-lg ${this.state.valid ? '' : 'error'}`} />
Cevap #2
Sınıfları kullanıp kullanmamaya karar vermek için oldukça fazla mantık gerektiğinde classnames kullanırım. Çok basit bir örnek:
...
var liClasses = classNames({
'main-class': true,
'activeClass': self.state.focused === index
});
return (<li className={liClasses}>{data.name}</li>);
...
Bunu söyledikten sonra, eğer bir bağımlılık eklemek istemiyorsanız, aşağıda daha iyi cevaplar var.
Cevap #3
Sadece JavaScript kullan.
<li className={[activeClass, data.klass, "main-class"].join(' ')} />
Bir nesnedeki anahtarlar ve değerlere dayalı sınıflar eklemek istiyorsanız, şunları kullanabilirsiniz:
function classNames(classes) {
return Object.entries(classes)
.filter(([key, value]) => value)
.map(([key, value]) => key)
.join(' ');
}
const classes = {
'maybeClass': true,
'otherClass': true,
'probablyNotClass': false,
};
const myClassNames = classNames(classes);
// Output: "maybeClass otherClass"
<li className={myClassNames} />
Veya daha basit:
const isEnabled = true;
const isChecked = false;
<li className={[isEnabled && 'enabled', isChecked && 'checked']
.filter(e => !!e)
.join(' ')
} />
// Output:
// <li className={'enabled'} />
Cevap #4
Birleştir
Gösterişli olmaya gerek yok, ben CSS modüllerini kullanıyorum ve bu kolay
import style from '/css/style.css';
<div className={style.style1+ ' ' + style.style2} />
Bu şu sonucu doğuracaktır:
<div class="src-client-css-pages-style1-selectionItem src-client-css-pages-style2">
Başka bir deyişle, her iki stil
Koşul Cümleleri
Aynı fikri if'lerle kullanmak kolay olurdu
const class1 = doIHaveSomething ? style.style1 : 'backupClass';
<div className={class1 + ' ' + style.style2} />
ES6
Son bir yıldır şablon literallerini kullanıyorum, bu yüzden bahsetmeye değer olduğunu düşünüyorum, onları çok ifade edici ve okunması kolay buluyorum:
`${class1} anotherClass ${class1}`
Cevap #5
Bu, ES6 şablon literalleri ile gerçekleştirilebilir:
<input className={`base-input-class ${class1} ${class2}`}>
(anlaşılır olması için düzenlendi)
Cevap #6
Bir öğeyi birden fazla sınıf adıyla şöyle oluşturabilirsiniz:
<li className="class1 class2 class3">foo</li>
Doğal olarak, sınıf adlarını içeren bir dize kullanabilir ve bu dizeyi öğenin sınıf adlarını güncellemek için işleyebilirsiniz.
var myClassNammes = 'class1 class2 class3';
...
<li className={myClassNames}>foo</li>
Cevap #7
Genellikle insanlar sever
<div className={ `head ${style.class1} ${Style.class2}` }><div>
VEYA
<div className={ 'head ' + style.class1 + ' ' + Style.class2 }><div>
VEYA
<div className={ ['head', style.class1 , Style.class2].join(' ') }><div>
Ama bu işi yapmak için bir fonksiyon oluşturmayı seçebilirsiniz
function joinAll(...classes) {
return classes.join(" ")
}
sonra şöyle çağır:
<div className={joinAll('head', style.class1 , style.class2)}><div>
Cevap #8
Bunu ES6 ile şöyle yapabilirsiniz:
className = {`
text-right
${itemId === activeItemId ? 'active' : ''}
${anotherProperty === true ? 'class1' : 'class2'}
`}
Birden fazla sınıf ve koşulu listeleyebilir ve ayrıca statik sınıfları da dahil edebilirsiniz. Ek bir kütüphane eklemeniz gerekli değildir.
İyi şanslar ;)
Cevap #9
Vanilya JS
Harici kütüphanelere gerek yok - sadece ES6 şablon dizelerini kullanın:
<i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
Cevap #10
Sadece birden fazla sınıf eklemek için harici bir paket kullanmamız gerektiğini sanmıyorum.
Ben şahsen kullanıyorum
<li className={`li active`}>Stacy</li>
veya
<li className={`li ${this.state.isActive ? 'active' : ''}`}>Stacy<li>
veya
<li className={'li ' + (this.state.isActive ? 'active' : '') }>Stacy<li>
İkincisi ve üçüncüsü, sınıfları koşullu olarak eklemeniz veya kaldırmanız gerekirse.
Cevap #11
CSS Modüllerini (veya Sass Modüllerini) kullanarak stilinizi belirli bir bileşene de izole edebilirsiniz.
"Bileşen kapsamlı CSS, minimal yan etkiyle geleneksel, taşınabilir CSS yazmanıza olanak tanır: Seçici adı çakışmaları veya diğer bileşenlerin stillerini etkileme endişeleri artık yok."
import * as styles from "./whatever.module.css" // css version
import * as styles from "./whatever.module.scss" // sass version
<div className={`${styles.class1} ${styles.class2}`}>
INSERT YOUR CODE HERE
</div>
Ref1 Ref2
Cevap #12
Belki classnames sana yardımcı olabilir.
var classNames = require('classnames');
classNames('foo', {'xx-test': true, bar: false}, {'ox-test': false}); // => 'foo xx-test'
Cevap #13
Bu, https://www.npmjs.com/package/clsx ile yapılabilir :
https://www.npmjs.com/package/clsx
Öncelikle onu kurun:
npm install --save clsx
Sonra bunu bileşen dosyanıza aktarın:
import clsx from 'clsx';
Sonra içe aktarılan fonksiyonu bileşeninizde kullanın:
<div className={ clsx(classes.class1, classes.class2)}>
Cevap #14
Aşağıdakileri yapabilirsiniz:
<li key={index} className={`${activeClass} ${data.class} main-class`}></li>
Kısa ve basit bir çözüm, umarım yardımcı olur.
