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

fat*_*ahn 51 css reactjs material-design material-ui jss

使用css-in-js方法向react组件添加类,如何添加多个组件?

这是classes变量:

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

这是我如何使用它:

    return (
     <div className={ this.props.classes.container }>
Run Code Online (Sandbox Code Playgroud)

上面的工作,但是有没有办法添加两个类,而不使用classNamesnpm包?就像是:

     <div className={ this.props.classes.container + this.props.classes.spacious}>
Run Code Online (Sandbox Code Playgroud)

klu*_*gjo 91

你可以使用字符串插值:

<div className={`${this.props.classes.container} ${this.props.classes.spacious}`}>
Run Code Online (Sandbox Code Playgroud)

  • 并且记住不要在类之间添加逗号!我不小心这么做了,第一个在一段时间内悄无声息地坏了 (11认同)
  • 哦,天哪,反应代码变得更难看了:/ (2认同)
  • 这是我第一次遇到这样的场景:字符串插值实际上比老式的方式更乏味:`className={classes.container+' '+classes.spacious}` (2认同)

Min*_*ini 40

你可以安装这个包

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'
Run Code Online (Sandbox Code Playgroud)

  • `@material-ui/core` 现在依赖于 `clsx`,所以如果您不想增加包大小,您将需要使用它 - https://www.npmjs.com/package/clsx (7认同)
  • 这是Material-UI在他们的一些示例中使用的方法,并且效果很好,所以我建议您这样做。 (3认同)
  • 这应该是公认的答案。按预期工作 (2认同)
  • 也一直在使用这种方法。不仅对于具有多个类名很有用,而且对于使其成为条件类也很有用。 (2认同)

wil*_*l92 13

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

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

import classNames from 'classnames';

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

<div className={classNames(classes.container, classes.spacious)} />
Run Code Online (Sandbox Code Playgroud)

确保您导入classNames !!!

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


Muz*_*301 11

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

className={`${classes.myClass}  ${this.props.classes.myClass2} MyStringClass`}
Run Code Online (Sandbox Code Playgroud)

同时进行三堂课


Vac*_*Sir 8

您还可以使用extend属性(默认情况下启用jss-extend插件):

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

// ...
<div className={ this.props.classes.spaciousContainer }>
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,默认情况下不再启用...投票启用 [here](https://github.com/mui-org/material-ui/issues/9342#) (2认同)

Raz*_*ero 6

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

首先安装它:

npm install --save clsx

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

import clsx from 'clsx';

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

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

  • `clsx` 包比 `classnames` 小,所以我更喜欢这个解决方案 (6认同)
  • clsx 包含在 Material UI 中,因此它比类名更受青睐 (4认同)
  • 根据 Wayne Bloss 在 Mini 不太理想的答案下的评论:“@material-ui/core 现在依赖于 clsx,所以如果您不想增加捆绑包大小,您将需要使用它”。所以,这个答案+1。 (2认同)
  • 最新的“@mui/*”包中似乎没有包含“clsx” (2认同)

Ole*_*nen 5

是的,jss-composes为您提供了这一点:

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

然后,您只需使用classes.spacious。


小智 5

我认为这可以解决您的问题:

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

和在反应成分:

<div className={`${classes.container} ${classes.spacious}`}>
Run Code Online (Sandbox Code Playgroud)