如何使用类道具在Material UI中添加多个类


92

使用css-in-js方法将类添加到React组件,如何添加多个组件?

这是class变量:

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 =“ container spacious”>为什么需要将它作为属性传递吗?
Leo Farmer

2
您只是在两个className之间缺少空格。
Shanimal

是的,如上所述,您只需要正确地将类连接在一起,并在两者之间留一个空格即可!无需任何其他软件包。
Taylor A. Leach,

Answers:


180

您可以使用字符串插值:

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

5
并记住不要在课程之间添加逗号!我做错了,第一个在没有注意到的情况下默默地打破了
Pere

班级之间必须有空隙
Yoel

49

你可以安装这个软件包

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

2
这应该是公认的答案。按预期工作
Howie

2
也一直在使用这种方法。不仅对于具有多个类名很有用,而且对于使其成为条件类也很有用。
拉链

4
@material-ui/core现在取决于clsx,因此,如果您不想增加捆绑包的大小,则可以使用它-npmjs.com/package/clsx
Wayne Bloss

34

您可以使用clsx。我注意到它在MUI按钮示例中使用

首先安装它:

npm install --save clsx

然后将其导入您的组件文件中:

import clsx from 'clsx';

然后在组件中使用导入的函数:

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


5
clsx软件包小于classnames,所以我更喜欢这种解决方案
Hoang Trinh

2
clsx被包括在材料UI,所以其多类名优选
DBrown

1
Per Wayne Bloss在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。因此,为此答案+1。
cssyphus

20

要对一个组件应用多个类,请将要应用的类包装在classNames中。

例如,根据您的情况,您的代码应如下所示:

import classNames from 'classnames';

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

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

确保您导入classNames !!!

看一下材料ui文档,他们在一个组件中使用多个类来创建自定义按钮


9

您还可以使用extend属性(默认情况下启用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'

显示错误webpack构建:找不到模块:错误:无法解析
Pranay Soni

1

您可以通过这种方式同时添加多个字符串类和变量类或props类

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

同时三节课


-1

如果要元素分配多个类名,则可以使用arrays

因此,在上面的代码中,如果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

8
不确定为什么这是公认的答案,@ Glauber Ramos是正确的,Material UI不能那样工作。
timotgl

-1

如前所述,您可以使用字符串插值

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

您可以尝试使用classnameshttps://www.npmjs.com/package/classnames


您的答案的两个部分都是其他成员较早提供的。您要做的只是在一个答案中重复它们。-1 (建议您删除此答案并恢复2分)
cssyphus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.