Как добавить несколько классов в Material UI, используя реквизиты классов

Используя метод 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}>

14 ответов

Решение

Если вы хотите назначить несколько имен классов для вашего элемента, вы можете использовать массивы.

Так что в вашем коде выше, если this.props.classes разрешается в нечто вроде ['container', 'acious'], т.е. если

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

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

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

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

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

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

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

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

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

npm install --save clsx

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

import clsx from 'clsx';

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

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

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

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'

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

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

import classNames from 'classnames';

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

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

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

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

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

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

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

Таким образом вы можете одновременно добавить несколько строковых классов и классов переменных или классов свойств.

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

три класса одновременно

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

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

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

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

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

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

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

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'

Вы можете использовать этот метод ниже:

      import clsx from 'clsx';

 return (

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

Эта ссылка помогает.

Вы можете применить два класса в пользовательском интерфейсе материала, как это

      import classNames from "classnames";
import { makeStyles } from "@material-ui/core/styles";

const useStyles = makeStyles({
  container: {
    display: 'flex',
    flexWrap: 'wrap',
  },
  spacious: {
    padding: 10,
  },
});

какой-то код

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

Как добавить два класса с помощью оператора сравнения в Material UI.

Если вы хотите использовать оператор сравнения для определения одного или двух классов, вам нужно применить

      
import classNames from "classnames";
import { makeStyles } from "@material-ui/core/styles";

const useStyles = makeStyles({
  maineButton: {
   borderRadius: "10px",
   minWidth: "80px",
   border: "1x solid #dcdcdc",
  },
  selectedButton: {
    border: "1x solid #3f51b5",
  },
});

какой-то код

      const [selected, setSelected] = useState(0);

какой-то код

      {data?.map((el, index) => (
   <ButtonBase 
     className={classNames(
        classes.maineButton, 
        index === selected && classes.selectedButton
        )}
     onClick{()=> setSelected(index)}
   >
     {el.text}
   </ButtonBase>
))}

если выбрано, это даст вам два класса

      className={classNames(classes.maineButton, classes.selectedButton)}

если нет, то будет только один

      className={classNames(classes.maineButton)}

Это можно сделать безболезненно с деструктуризацией, в конце концов, это объекты JavaScript:

      const truncate = {
  width: '100px',
  whiteSpace: 'nowrap',
  overflow: 'hidden',
  textOverflow: 'ellipsis',
};
email: {
    color: '#747474',
    ...truncate,
  },

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

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

И ты можешь попробовать classnamesбиблиотека, https://www.npmjs.com/package/classnames

Другие вопросы по тегам