Cách thêm nhiều lớp trong Material UI bằng cách sử dụng các lớp đạo cụ


92

Sử dụng phương thức css-in-js để thêm các lớp vào một thành phần phản ứng, làm cách nào để thêm nhiều thành phần?

Đây là biến lớp:

const styles = theme => ({
 container: {
  display: 'flex',
  flexWrap: 'wrap'
},
 spacious: {
  padding: 10
},
});

Đây là cách tôi sử dụng nó:

    return (
     <div className={ this.props.classes.container }>

Các cách trên hoạt động, nhưng có cách nào để thêm cả hai lớp mà không sử dụng classNamesgói npm không? Cái gì đó như:

     <div className={ this.props.classes.container + this.props.classes.spacious}>

3
Có thể tôi đang thiếu thứ gì đó, nhưng bạn không thể thực hiện <div className = "container wide"> Tại sao bạn cần chuyển nó dưới dạng thuộc tính?
Leo Farmer

2
bạn chỉ thiếu một khoảng trắng giữa hai className.
Đồng ý

Đúng như đã nêu ở trên, bạn chỉ cần nối các lớp với nhau một cách chính xác bằng một khoảng trắng ở giữa! Không cần bất kỳ gói bổ sung nào.
Taylor A. Leach

Câu trả lời:


181

bạn có thể sử dụng nội suy chuỗi:

<div className={`${this.props.classes.container} ${this.props.classes.spacious}`}>

5
và nhớ đừng thêm dấu phẩy vào giữa các lớp! Tôi đã làm do nhầm lẫn và là người đầu tiên phá vỡ âm thầm mà không nhận thấy trong một thời gian
Pere

Và phải có khoảng cách giữa các lớp
Yoel

49

bạn có thể cài đặt gói này

https://github.com/JedWatson/classnames

và sau đó sử dụng nó như thế này

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'

3
Đây là cách tiếp cận Material-UI sử dụng trong một số ví dụ của họ và hoạt động tốt, vì vậy tôi khuyên bạn nên sử dụng cách này.
Craig Myles

2
Đây phải là câu trả lời được chấp nhận. Hoạt động như mong đợi
Howie

2
Cũng đang sử dụng cách tiếp cận này. Hữu ích không chỉ để có nhiều tên lớp mà còn để làm cho nó có điều kiện.
mouthzipper

4
@material-ui/corebây giờ phụ thuộc vào clsx, vì vậy nếu bạn không muốn tăng kích thước bó của bạn, bạn sẽ muốn sử dụng mà thay vào đó - npmjs.com/package/clsx
Wayne Bloss

34

Bạn có thể sử dụng clsx . Tôi nhận thấy nó được sử dụng trong các ví dụ về nút MUI

Trước tiên hãy cài đặt nó:

npm install --save clsx

Sau đó, nhập nó vào tệp thành phần của bạn:

import clsx from 'clsx';

Sau đó, sử dụng hàm đã nhập trong thành phần của bạn:

<div className={ clsx(classes.container, classes.spacious)}>


5
clsxgói nhỏ hơn classnames, vì vậy tôi thích giải pháp này hơn
Hoàng Trinh

2
clsx được bao gồm trong giao diện người dùng Material, vì vậy nó được ưu tiên hơn các tên lớp
DBrown

1
Theo nhận xét của Wayne Bloss' bên dưới câu trả lời ít tối ưu Mini: @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. Vì vậy, +1 cho câu trả lời này.
cssyphus

20

Để áp dụng nhiều lớp cho một thành phần, hãy bọc các lớp bạn muốn áp dụng trong classNames.

Ví dụ: trong tình huống của bạn, mã của bạn sẽ trông như thế này,

import classNames from 'classnames';

const styles = theme => ({
  container: {
    display: "flex",
    flexWrap: "wrap"
  },
  spacious: {
    padding: 10
  }
});

<div className={classNames(classes.container, classes.spacious)} />

Đảm bảo rằng bạn nhập classNames !!!

Hãy xem tài liệu material ui nơi họ sử dụng nhiều lớp trong một thành phần để tạo một nút tùy chỉnh


9

Bạn cũng có thể sử dụng thuộc tính mở rộng ( plugin jss-extension được bật theo mặc định):

const styles = theme => ({
  container: {
    display: 'flex',
    flexWrap: 'wrap'
  },
  spaciousContainer: {
    extend: 'container',
    padding: 10
  },
});

// ...
<div className={ this.props.classes.spaciousContainer }>

2
Thật không may, không được kích hoạt theo mặc định nữa ... bỏ phiếu để cho phép ở đây
egerardus

7

Tôi nghĩ điều này sẽ giải quyết được vấn đề của bạn:

const styles = theme => ({
 container: {
  display: 'flex',
  flexWrap: 'wrap'
},
 spacious: {
  padding: 10
},
});

và trong thành phần phản ứng:

<div className={`${classes.container} ${classes.spacious}`}>

6

Có, jss-composes cung cấp cho bạn điều này:

const styles = theme => ({
 container: {
  display: 'flex',
  flexWrap: 'wrap'
},
 spacious: {
  composes: '$container',
  padding: 10
},
});

Và sau đó bạn chỉ cần sử dụng class.spacious.


trong khi sử dụng nhiều tên lớp bằng cách sử dụng soạn thư, nó không hoạt động. Codeandbox.io/s/practical-cohen-l6qt5?file=/src/text.js
user970780

2

classNames gói cũng có thể được sử dụng nâng cao như:

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'

hiển thị lỗi xây dựng webpack: Không tìm thấy mô-đun: Lỗi: Không thể giải quyết 'tên lớp' trong
Pranay Soni

1

Bạn có thể thêm nhiều lớp chuỗi và lớp biến hoặc lớp đạo cụ cùng lúc theo cách này

className={`${classes.myClass}  ${this.props.classes.myClass2} MyStringClass`}

ba lớp cùng một lúc


-1

Nếu bạn muốn gán nhiều tên lớp cho phần tử của mình, bạn có thể sử dụng mảng .

Vì vậy, trong đoạn mã của bạn ở trên, nếu this.props.classes giải quyết thành một cái gì đó như ['container', 'wide'], tức là nếu

this.props.classes = ['container', 'spacious'];

bạn có thể chỉ cần gán nó cho div là

<div className = { this.props.classes.join(' ') }></div>

và kết quả sẽ là

<div class='container spacious'></div>

bạn có chắc các lớp học được đặt tên cách nhau bởi ,trong kết quả
Pardeep Jain

8
Không chắc tại sao đây là câu trả lời được chấp nhận, @Glauber Ramos nói đúng, Material UI không hoạt động như vậy.
timotgl

-1

Như đã đề cập, bạn có thể sử dụng nội suy chuỗi

className={`${this.props.classes.container}  ${this.props.classes.spacious}`}

Và bạn có thể thử classnamesthư viện, https://www.npmjs.com/package/classnames


Cả hai phần của câu trả lời của bạn đã được cung cấp trước đó bởi các thành viên khác. Tất cả những gì bạn làm là lặp lại chúng trong một câu trả lời duy nhất. -1 (Đề nghị bạn xóa câu trả lời này và khôi phục 2pts của bạn)
cssyphus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.