Ответ 1
вы можете использовать интерполяцию строк:
<div className={`${this.props.classes.container} ${this.props.classes.spacious}`}>
Используя метод 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}>
вы можете использовать интерполяцию строк:
<div className={`${this.props.classes.container} ${this.props.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 }>
Я думаю, что это решит вашу проблему:
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.
Если вы хотите, чтобы назначал вам несколько имен класса, вы можете использовать массивы.
Итак, в вашем коде выше, если this.props.classes разрешает что-то вроде ['container', 'spacious'], то есть if
this.props.classes = ['container', 'spacious'];
вы можете просто назначить его div как
<div className = { this.props.classes.join(' ') }></div>
и результат будет
<div class='container spacious'></div>
Вы могли бы использовать clsx. Я заметил, что это используется в примерах кнопок MUI
Сначала установите его:
npm install --save clsx
Затем импортируйте его в файл компонента:
import clsx from 'clsx';
Затем используйте импортированную функцию в вашем компоненте:
<div className={ clsx(classes.container, classes.spacious)}>