Как добавить несколько классов в пользовательский интерфейс материалов с помощью реквизитов классов

Используя метод css-in-js для добавления классов в компонент реагирования, как добавить несколько компонентов?

Вот переменная классов:

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

Вот как я это использовал:

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

Вышеуказанное работает, но есть ли способ добавить оба класса, не используя пакет classNames npm? Что-то вроде:

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

Ответ 1

вы можете использовать интерполяцию строк:

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

Ответ 2

Вы можете установить этот пакет

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

Чтобы применить несколько классов к компоненту, оберните классы, которые вы хотите применить, в classNames.

Например, в вашей ситуации ваш код должен выглядеть следующим образом:

import classNames from 'classnames';

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

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

Убедитесь, что вы импортируете classNames !!!

Ознакомьтесь с документацией по пользовательскому интерфейсу, в которой они используют несколько классов в одном компоненте для создания настраиваемой кнопки.

Ответ 4

Вы также можете использовать свойство extend (плагин jss-extend включен по умолчанию):

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

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

Ответ 5

Я думаю, что это решит вашу проблему:

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

и в реактивном компоненте:

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

Ответ 6

Да, jss-composes предоставляет вам следующее:

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

И тогда вы просто используете classes.spacious.

Ответ 7

Если вы хотите, чтобы назначал вам несколько имен класса, вы можете использовать массивы.

Итак, в вашем коде выше, если this.props.classes разрешает что-то вроде ['container', 'spacious'], то есть if

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

вы можете просто назначить его div как

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

и результат будет

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

Ответ 8

Вы могли бы использовать clsx. Я заметил, что это используется в примерах кнопок MUI

Сначала установите его:

npm install --save clsx

Затем импортируйте его в файл компонента:

import clsx from 'clsx';

Затем используйте импортированную функцию в вашем компоненте:

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