Menggunakan metode css-in-js untuk menambahkan kelas ke komponen react, bagaimana cara menambahkan beberapa komponen?
Berikut adalah variabel kelas:
const styles = theme => ({
container: {
display: 'flex',
flexWrap: 'wrap'
},
spacious: {
padding: 10
},
});
Inilah cara saya menggunakannya:
return (
<div className={ this.props.classes.container }>
Cara di atas berfungsi, tetapi apakah ada cara untuk menambahkan kedua kelas, tanpa menggunakan classNames
paket npm? Sesuatu seperti:
<div className={ this.props.classes.container + this.props.classes.spacious}>
Jawaban:
Anda dapat menggunakan interpolasi string:
<div className={`${this.props.classes.container} ${this.props.classes.spacious}`}>
sumber
Anda dapat menginstal paket ini
https://github.com/JedWatson/classnames
dan kemudian gunakan seperti ini
classNames('foo', 'bar'); // => 'foo bar' classNames('foo', { bar: true }); // => 'foo bar' classNames({ 'foo-bar': true }); // => 'foo-bar' classNames({ 'foo-bar': false }); // => '' classNames({ foo: true }, { bar: true }); // => 'foo bar' classNames({ foo: true, bar: true }); // => 'foo bar' // lots of arguments of various types classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux' // other falsy values are just ignored classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
sumber
@material-ui/core
sekarang tergantungclsx
, jadi jika Anda tidak ingin meningkatkan ukuran bundel Anda, Anda akan ingin menggunakannya - npmjs.com/package/clsxAnda bisa menggunakan clsx . Saya perhatikan itu digunakan dalam contoh tombol MUI
Pertama instal:
npm install --save clsx
Kemudian impor ke file komponen Anda:
import clsx from 'clsx';
Kemudian gunakan fungsi yang diimpor di komponen Anda:
<div className={ clsx(classes.container, classes.spacious)}>
sumber
clsx
paket lebih kecil dariclassnames
, jadi saya lebih suka solusi ini@material-ui/core now depends on clsx, so if you don't want to increase your bundle size you'll want to use that instead
. Jadi, +1 untuk jawaban ini.Untuk menerapkan beberapa kelas ke sebuah komponen, bungkus kelas yang ingin Anda terapkan dalam classNames.
Misalnya, dalam situasi Anda, kode Anda akan terlihat seperti ini,
import classNames from 'classnames'; const styles = theme => ({ container: { display: "flex", flexWrap: "wrap" }, spacious: { padding: 10 } }); <div className={classNames(classes.container, classes.spacious)} />
Pastikan Anda mengimpor classNames !!!
Lihat dokumentasi ui material di mana mereka menggunakan beberapa kelas dalam satu komponen untuk membuat tombol yang disesuaikan
sumber
Anda juga dapat menggunakan properti perluasan ( plugin jss-expand diaktifkan secara default):
const styles = theme => ({ container: { display: 'flex', flexWrap: 'wrap' }, spaciousContainer: { extend: 'container', padding: 10 }, }); // ... <div className={ this.props.classes.spaciousContainer }>
sumber
Saya pikir ini akan menyelesaikan masalah Anda:
const styles = theme => ({ container: { display: 'flex', flexWrap: 'wrap' }, spacious: { padding: 10 }, });
dan dalam komponen reaksi:
<div className={`${classes.container} ${classes.spacious}`}>
sumber
Ya, jss-composes memberi Anda ini:
const styles = theme => ({ container: { display: 'flex', flexWrap: 'wrap' }, spacious: { composes: '$container', padding: 10 }, });
Dan kemudian Anda hanya menggunakan class.spacious.
sumber
classNames
paket juga dapat digunakan semaju:import classNames from 'classnames'; var arr = ['b', { c: true, d: false }]; classNames('a', arr); // => 'a b c' let buttonType = 'primary'; classNames({ [`btn-${buttonType}`]: true }); // => 'btn-primary'
sumber
Anda dapat menambahkan beberapa kelas string dan kelas variabel atau kelas alat peraga secara bersamaan dengan cara ini
className={`${classes.myClass} ${this.props.classes.myClass2} MyStringClass`}
tiga kelas pada waktu yang sama
sumber
Jika Anda ingin menetapkan beberapa nama kelas ke elemen Anda, Anda dapat menggunakan array .
Jadi dalam kode Anda di atas, jika this.props.classes memutuskan sesuatu seperti ['container', 'spacious'], yaitu jika
this.props.classes = ['container', 'spacious'];
Anda cukup menetapkannya ke div sebagai
<div className = { this.props.classes.join(' ') }></div>
dan hasilnya akan seperti itu
<div class='container spacious'></div>
sumber
,
dalam hasilSeperti yang telah disebutkan, Anda dapat menggunakan interpolasi string
className={`${this.props.classes.container} ${this.props.classes.spacious}`}
Dan Anda dapat mencoba
classnames
perpustakaan, https://www.npmjs.com/package/classnamessumber