Saya baru mengenal ReactJS dan JSX dan saya mengalami sedikit masalah dengan kode di bawah ini.
Saya mencoba menambahkan beberapa kelas ke className
atribut pada masing-masing li
:
<li key={index} className={activeClass, data.class, "main-class"}></li>
Komponen React saya adalah:
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
Menggertak
sumber
sumber
classNames={{foo: true, bar: true, baz: false}}
danclassNames={["foo", "bar"]}
hanya bekerja ?Jawaban:
Saya menggunakan classnames ketika ada cukup banyak logika diperlukan untuk menentukan kelas untuk (tidak) digunakan. Contoh yang terlalu sederhana :
Yang mengatakan, jika Anda tidak ingin menyertakan ketergantungan maka ada jawaban yang lebih baik di bawah ini.
sumber
import classNames from 'classnames'
untuk digunakan dalam komponenclassName={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>;
Saya menggunakan
ES6
literal templat . Sebagai contoh:Dan kemudian render saja:
Versi satu-baris:
sumber
<input className={`class1 ${class2}`}>
<input class=" form-control input-lg round-lg" />
. Perhatikan ruang ekstra di awal. Ini valid, tapi jelek. Bahkan bereaksi, FAQ merekomendasikan cara lain atau menggunakan paket classnames: reactjs.org/docs/faq-styling.htmlCukup gunakan JavaScript.
Jika Anda ingin menambahkan kunci dan nilai berbasis kelas di objek Anda bisa menggunakan yang berikut:
Atau bahkan lebih sederhana:
sumber
className={['terra-Table', medOrder.resource.status]}
className={[listOfClasses].join(' ')}
berfungsi untuk saya, terima kasih!Concat
Tidak perlu mewah saya menggunakan modul CSS dan mudah
Ini akan menghasilkan:
Dengan kata lain, keduanya gaya
Persyaratan
Akan mudah menggunakan ide yang sama dengan if
sumber
className={
slider $ {className? `$ {className}: ''}
}` `. Tapi ini banyak. [note: 'something' + undefined = 'something underfined'. Konversi dinamis.Ini dapat dicapai dengan literal templat ES6:
sumber
<input className={`${class1} ${class2}`}>
Anda dapat membuat elemen dengan beberapa nama kelas seperti ini:
Secara alami, Anda bisa menggunakan string yang berisi nama kelas dan memanipulasi string ini untuk memperbarui nama kelas elemen.
sumber
"
bukan'
. Maaf soal itu.Ini adalah bagaimana Anda dapat melakukannya dengan ES6:
Anda dapat membuat daftar beberapa kelas dan ketentuan dan juga Anda bisa menyertakan kelas statis. Tidak perlu menambahkan perpustakaan tambahan.
Semoga berhasil ;)
sumber
Vanilla JS
Tidak perlu perpustakaan eksternal - cukup gunakan string template ES6 :
sumber
Mungkin classnames dapat membantu Anda.
sumber
Saya tidak berpikir kita perlu menggunakan paket eksternal hanya dengan menambahkan beberapa kelas.
Saya pribadi menggunakan
atau
yang kedua jika Anda perlu menambah atau menghapus kelas secara kondisional.
sumber
Hanya dengan menambahkan, kita dapat memfilter string kosong.
sumber
Anda dapat membuat elemen dengan beberapa nama kelas seperti ini, saya sudah mencoba keduanya, ini berfungsi dengan baik ...
Jika Anda mengimpor css maka Anda dapat mengikuti cara ini: Cara 1:
cara 2:
**
Jika Anda menerapkan css sebagai internal:
sumber
Anda dapat melakukan hal berikut:
Solusi singkat dan sederhana, semoga ini membantu.
sumber
Ini dapat dilakukan dengan https://www.npmjs.com/package/clsx :
https://www.npmjs.com/package/clsx
Pertama instal:
Kemudian impor dalam file komponen Anda:
Kemudian gunakan fungsi yang diimpor di komponen Anda:
sumber
Terlambat ke pesta, tapi mengapa menggunakan pihak ketiga untuk masalah sesederhana itu?
Anda bisa melakukannya seperti yang disebutkan oleh @Huw Davies - cara terbaik
Keduanya bagus. Tetapi menulis bisa menjadi rumit untuk aplikasi besar. Untuk membuatnya optimal, saya melakukan hal yang sama di atas tetapi memasukkannya ke dalam kelas pembantu
Menggunakan fungsi pembantu saya di bawah ini, memungkinkan saya untuk menjaga logika terpisah untuk pengeditan di masa depan, dan juga memberi saya beberapa cara untuk menambahkan kelas
atau
Ini adalah fungsi pembantu saya di bawah ini. Saya telah memasukkannya ke dalam helper.js di mana saya menyimpan semua metode umum saya. Menjadi fungsi yang sangat sederhana, saya menghindari menggunakan pihak ke-3 untuk menjaga kontrol
sumber
Anda dapat menggunakan array dan kemudian bergabung dengan mereka menggunakan ruang.
Ini akan menghasilkan:
sumber
Saya tahu ini adalah jawaban yang terlambat, tetapi saya harap ini akan membantu seseorang.
Pertimbangkan bahwa Anda telah mendefinisikan kelas berikut dalam file css ' primer ', ' font-i ', ' font-xl '
akan melakukan trik!
Untuk info lebih lanjut: https://www.youtube.com/watch?v=j5P9FHiBVNo&list=PLC3y8-rFHvwgg3vaYJgHGnModB54rxOk3&index=20
sumber
untuk menambahkan lebih banyak kelas
sumber
Menggunakan contoh TodoTextInput.js facebook
menggantikan classnames dengan kode plain vanilla js akan terlihat seperti ini:
sumber
Jika Anda tidak ingin mengimpor modul lain, fungsi ini berfungsi seperti
classNames
modul.Anda bisa menggunakannya seperti ini:
sumber
function classNames(rules) { return Object.entries(rules) .reduce( (arr, [cls, flag]) => { if (flag) arr.push(cls); return arr }, [] ).join(" ") }
Itu yang saya lakukan:
Komponen:
Komponen Panggilan:
sumber
Saya menggunakan React 16.6.3 dan @Material UI 3.5.1, dan dapat menggunakan array di className like
className={[classes.tableCell, classes.capitalize]}
Jadi, dalam contoh Anda, berikut ini akan serupa.
sumber
Gunakan https://www.npmjs.com/package/classnames
impor nama class dari 'nama kelas';
Dapat menggunakan beberapa kelas menggunakan koma yang dipisahkan:
Dapat menggunakan beberapa kelas menggunakan koma yang dipisahkan dengan kondisi:
Menggunakan array sebagai alat peraga ke classNames juga akan berfungsi, tetapi memberikan peringatan misalnya
sumber
Saya menggunakan paket rc-classnames .
Anda dapat menambahkan kelas dalam format apa pun (Array, Object, Argument). Semua nilai kebenaran dari array atau Argumen plus kunci pada objek yang sama dengan
true
digabungkan.sebagai contoh:
sumber
I
bind
classNames
ke modul css diimpor ke dalam komponen.classnames
memberikan kemampuan untuk mendeklarasikanclassName
elemen Bereaksi dengan cara deklaratif.ex:
sumber
Saya biasanya menggunakannya seperti ini: (dalam kasus Anda)
Ketika datang ke JSX dan (biasanya) kami memiliki beberapa json ... daripada Anda loop itu ... komponen . map , ditambah beberapa persyaratan untuk memeriksa apakah properti json ada untuk merender nama kelas tergantung pada nilai properti dari JSON. Dalam contoh di bawah ini, component_color dan component_dark_shade adalah properti dari component.map ()
Output:
<div class="component no-color light" ....
Atau:<div class="component blue dark" ....
tergantung pada nilai dari peta ...sumber
Ketika saya memiliki banyak kelas yang berbeda, saya telah menemukan yang berikut berguna.
Filter menghapus salah satu
null
nilai dan gabungan menempatkan semua nilai yang tersisa ke dalam string yang dipisahkan spasi.sumber