클래스 소품을 사용하여 머티리얼 UI에 여러 클래스를 추가하는 방법


92

css-in-js 메서드를 사용하여 반응 구성 요소에 클래스를 추가하는 경우 여러 구성 요소를 추가하려면 어떻게해야합니까?

다음은 클래스 변수입니다.

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

사용 방법은 다음과 같습니다.

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

위는 작동하지만 classNamesnpm 패키지 를 사용하지 않고 두 클래스를 모두 추가하는 방법이 있습니까? 다음과 같은 것 :

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

3
내가 뭔가를 놓치고 있지만 그냥 할 수는 없겠죠 <div className = "container wide"> 왜 그것을 속성으로 전달해야합니까?
레오 농부

2
두 개의 className 사이에 공백이 누락되었습니다.
Shanimal

예, 위에서 언급했듯이, 그 사이에 공백을두고 클래스를 올바르게 연결하면됩니다! 추가 패키지가 필요하지 않습니다.
Taylor A. Leach

답변:


180

문자열 보간을 사용할 수 있습니다.

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

5
그리고 클래스 사이에 쉼표를 추가하지 않는 것을 잊지 마십시오! 나는 실수로했고 첫 번째는 한동안 눈치 채지 못한 채 조용히 파산했다
Pere

그리고 수업 사이에 공간이 있어야합니다
Yoel

49

이 패키지를 설치할 수 있습니다

https://github.com/JedWatson/classnames

다음과 같이 사용하십시오

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
이것은 Material-UI가 일부 예제에서 사용하는 접근 방식이며 잘 작동하므로 이것을 권장합니다.
크레이그 마일스

2
이것은 받아 들여진 대답이어야합니다. 예상대로 작동
Howie

2
이 접근법도 사용했습니다. 여러 클래스 이름을 갖는 것뿐만 아니라 조건부로 만드는데도 유용합니다.
mouthzipper 2019

4
@material-ui/core이제에 의존 clsx하므로 번들 크기를 늘리지 않으려면 대신 사용하는 것이 좋습니다.- npmjs.com
Wayne Bloss

34

clsx를 사용할 수 있습니다 . MUI 버튼 예제 에서 사용 된 것으로 나타났습니다.

먼저 설치하십시오.

npm install --save clsx

그런 다음 구성 요소 파일로 가져옵니다.

import clsx from 'clsx';

그런 다음 컴포넌트에서 가져온 함수를 사용하십시오.

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


5
clsx패키지가보다 작 classnames
으므로이

2
clsx는 Material UI에 포함되어 있으므로 클래스 이름보다 선호됩니다
DBrown

1
Mini의 덜 최적화 된 답변 아래 Per Wayne Bloss의 의견 : @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. 이 답변에 +1하세요.
cssyphus

20

구성 요소에 여러 클래스를 적용하려면 적용하려는 클래스를 classNames 내에 래핑합니다.

예를 들어, 귀하의 상황에서 코드는 다음과 같아야합니다.

import classNames from 'classnames';

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

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

classNames를 가져와야합니다 !!!

하나의 구성 요소에서 여러 클래스를 사용하여 사용자 정의 버튼을 만드는 재료 UI 문서를 살펴보십시오.


9

extend 속성을 사용할 수도 있습니다 ( jss-extend 플러그인 은 기본적으로 활성화 됨).

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

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

2
불행히도, 수 있도록 기본 이상 ... 투표에 의해 활성화 여기
egerardus

7

나는 이것이 당신의 문제를 해결할 것이라고 생각합니다.

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

그리고 반응 구성 요소에서 :

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


2

classNames 패키지 는 다음과 같이 고급으로 사용할 수도 있습니다.

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'

show error webpack build : Module not found : Error : Ca n't resolve 'classnames'in
Pranay Soni

1

이런 식으로 여러 문자열 클래스와 변수 클래스 또는 소품 클래스를 동시에 추가 할 수 있습니다.

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

동시에 세 수업


-1

당신이 원하는 경우 여러 클래스 할당 하여 요소에 이름을, 당신은 할 수 배열을 사용 .

따라서 위의 코드에서 this.props.classes가 [ 'container', 'spacious']와 같은 것으로 확인되면, 즉

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

간단히 div에 할당 할 수 있습니다.

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

결과는

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

당신은으로 구분 된 이름을 확인 클래스입니다 ,결과에
Pardeep 자이나교

8
이것이 왜 허용되는 대답인지 확실하지 않습니다. @Glauber Ramos가 옳습니다. Material UI는 그렇게 작동하지 않습니다.
timotgl

-1

이미 언급했듯이 문자열 보간을 사용할 수 있습니다.

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

그리고 https://www.npmjs.com/package/classnamesclassnames 라이브러리 를 사용해 볼 수 있습니다.


귀하의 답변의 두 부분 모두 이전에 다른 회원이 제공했습니다. 당신이 한 모든 것은 하나의 대답으로 반복하는 것입니다. -1 (이 답변을 삭제하고 2 점을 복구 할 것을 제안)
cssyphus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.