クラスの小道具を使用してマテリアルUIに複数のクラスを追加する方法


95

css-in-jsメソッドを使用してreactコンポーネントにクラスを追加するには、複数のコンポーネントを追加するにはどうすればよいですか?

クラス変数は次のとおりです。

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 = "containerspaic">を実行することはできません。なぜそれをプロパティとして渡す必要があるのですか?
レオファーマー

2
2つのclassNameの間にスペースがないだけです。
Shanimal 2018年

ええ、上で述べたように、あなたはただ間にスペースを置いてクラスを正しく連結する必要があります!追加のパッケージは必要ありません。
テイラーA.リーチ

回答:


190

文字列補間を使用できます。

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

5
クラスの間にコンマを追加しないことを忘れないでください!私は間違ってやりました、そして最初のものはしばらく気付かずに静かに壊れました
ペレ

そして、クラスの間にスペースがなければなりません
Yoel

48

このパッケージをインストールできます

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がいくつかの例で使用しているアプローチであり、うまく機能するので、これをお勧めします。
Craig Myles 2018

2
これは受け入れられた答えでなければなりません。期待どおりに機能
Howie 2018

2
このアプローチも使用しています。複数のクラス名を持つだけでなく、条件付きにする場合にも役立ちます。
マウスジッパー

4
@material-ui/core今、依存clsxあなたがあなたの代わりにそれを使用したいと思うあなたのバンドルのサイズを大きくしたくないそうだとすれば、 - npmjs.com/package/clsx
ウェインBloss

36

clsxを使用できます。MUIボタンの例で使用されていることに気づきました

最初にインストールします。

npm install --save clsx

次に、それをコンポーネントファイルにインポートします。

import clsx from 'clsx';

次に、インポートした関数をコンポーネントで使用します。

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


5
clsxパッケージはよりも小さいのでclassnames、私はこのソリューションを好みます
HoangTrinh20年

2
clsxはマテリアルUIに含まれているため、クラス名よりも優先されます
DBrown 2010

1
Miniのあまり最適ではない答えの下にあるWayneBlossのコメントによると:@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

19

コンポーネントに複数のクラスを適用するには、適用するクラスをclassNames内でラップします。

たとえば、あなたの状況では、コードは次のようになります。

import classNames from 'classnames';

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

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

必ずclassNamesをインポートしてください!!!

1つのコンポーネントで複数のクラスを使用してカスタマイズされたボタンを作成するマテリアルUIドキュメントをご覧ください


9

拡張プロパティを使用することもできます(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:モジュールが見つかりません:エラー:「classnames」を解決できません
PranaySoni20年

1

この方法で、複数の文字列クラスと変数クラスまたは小道具クラスを同時に追加できます。

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

同時に3つのクラス


-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 Jain 2017

8
これが受け入れられた答えである理由がわかりません。@ GlauberRamosは正しいです。マテリアルUIはそのようには機能しません。
timotgl 2018年

-1

すでに述べたように、文字列補間を使用できます

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

そして、あなたはclassnamesライブラリ、 https://www.npmjs.com/package/classnamesを試すことができます


あなたの答えの両方の部分は、他のメンバーによって以前に提供されました。あなたがしたのは、単一の答えでそれらを繰り返すことだけでした。-1 (あなたがこの回答を削除し、あなたの2PTSを回復提案)
cssyphus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.