Comment ajouter plusieurs classes dans Material UI à l'aide des accessoires de classes


92

À l'aide de la méthode css-in-js pour ajouter des classes à un composant react, comment ajouter plusieurs composants?

Voici la variable classes:

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

Voici comment je l'ai utilisé:

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

Ce qui précède fonctionne, mais existe-t-il un moyen d'ajouter les deux classes sans utiliser le classNamespackage npm? Quelque chose comme:

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

3
Peut-être que je manque quelque chose, mais ne pouvez-vous pas simplement faire <div className = "container spacieux"> Pourquoi avez-vous besoin de le passer en tant que propriété?
— Leo Farmer

2
il vous manque juste un espace entre les deux classNames.
— Shanimal

Ouais, comme indiqué ci-dessus, il vous suffit de concater correctement les classes avec un espace entre les deux! Pas besoin de packages supplémentaires.
— Taylor A. Leach

Réponses:


180

vous pouvez utiliser l'interpolation de chaîne:

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

5
et n'oubliez pas de ne pas ajouter de virgules entre les classes! Je l'ai fait par erreur et le premier s'est cassé silencieusement sans s'en apercevoir pendant un moment
— Pere

Et il doit y avoir un espace entre les classes
— Yoel

49

vous pouvez installer ce package

https://github.com/JedWatson/classnames

puis utilisez-le comme ça

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
C'est l'approche que Material-UI utilise dans certains de leurs exemples, et fonctionne bien, je le recommande donc.
— Craig Myles

2
Cela devrait être la réponse acceptée. Fonctionne comme prévu
— Howie

2
J'utilise également cette approche. Utile non seulement pour avoir plusieurs noms de classe, mais aussi pour le rendre conditionnel.
— mouthzipper

4
@material-ui/coredépend maintenant de clsx, donc si vous ne voulez pas augmenter la taille de votre bundle, vous voudrez l'utiliser à la place - npmjs.com/package/clsx
— Wayne Bloss

34

Vous pouvez utiliser clsx . Je l'ai remarqué utilisé dans les exemples de boutons MUI

Installez-le d'abord:

npm install --save clsx

Puis importez-le dans votre fichier de composant:

import clsx from 'clsx';

Ensuite, utilisez la fonction importée dans votre composant:

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


5
clsxle paquet est plus petit que classnames, donc je préfère cette solution
— Hoang Trinh

2
clsx est inclus dans Material UI, il est donc préférable aux
— noms

1
Par le commentaire de Wayne Bloss ci - dessous réponse moins optimale 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. Donc, +1 pour cette réponse.
— cssyphus

20

Pour appliquer plusieurs classes à un composant, encapsulez les classes que vous souhaitez appliquer dans classNames.

Par exemple, dans votre situation, votre code devrait ressembler à ceci,

import classNames from 'classnames';

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

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

Assurez-vous d'importer classNames !!!

Jetez un œil à la documentation de l'interface utilisateur matérielle où ils utilisent plusieurs classes dans un composant pour créer un bouton personnalisé


9

Vous pouvez également utiliser la propriété extend (le plugin jss-extend est activé par défaut):

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

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

2
Malheureusement, plus activé par défaut ... votez pour l'activer ici
— egerardus

7

Je pense que cela résoudra votre problème:

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

et dans le composant de réaction:

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


2

classNames package peut également être utilisé aussi avancé que:

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: Erreur: Impossible de résoudre les 'noms de classe' dans
— Pranay Soni

1

Vous pouvez ajouter plusieurs classes de chaînes et classes variables ou classes d'accessoires en même temps de cette manière

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

trois cours en même temps


-1

Si vous souhaitez attribuer plusieurs noms de classe à votre élément, vous pouvez utiliser des tableaux .

Donc, dans votre code ci-dessus, si this.props.classes se résout en quelque chose comme ['container', 'spacieux'], c'est-à-dire si

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

vous pouvez simplement l'assigner à div comme

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

et le résultat sera

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

êtes-vous sûr que les classes nommées séparées par ,dans le résultat
— Pardeep Jain

8
Je ne sais pas pourquoi c'est la réponse acceptée, @Glauber Ramos a raison, Material UI ne fonctionne pas comme ça.
— timotgl

-1

Comme déjà mentionné, vous pouvez utiliser l'interpolation de chaîne

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

Et vous pouvez essayer la classnamesbibliothèque, https://www.npmjs.com/package/classnames


Les deux parties de votre réponse ont été fournies plus tôt par d'autres membres. Tout ce que vous avez fait, c'est de les répéter en une seule réponse. -1 (Je vous
— suggère de
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.