如何将多个类添加到ReactJS组件

Hec*_*tor 284 javascript css ecmascript-6 reactjs

我是ReactJS和JSX的新手,我对下面的代码有点问题.

我试图className在每个属性上添加多个类li:

<li key={index} className={activeClass, data.class, "main-class"}></li>
Run Code Online (Sandbox Code Playgroud)

我的React组件是:

var AccountMainMenu = React.createClass({
  getInitialState: function() {
    return { focused: 0 };
  },

  clicked: function(index) {
    this.setState({ focused: index });
  },

  render: function() {
    var self = this;
    var accountMenuData = [
      {
        name: "My Account",
        icon: "icon-account"
      },
      {
        name: "Messages",
        icon: "icon-message"
      },
      {
        name: "Settings",
        icon: "icon-settings"
      }
    /*{
        name:"Help &amp; Support &nbsp; <span class='font-awesome icon-support'></span>(888) 664.6261",
        listClass:"no-mobile last help-support last"
      }*/
    ];

    return (
      <div className="acc-header-wrapper clearfix">
        <ul className="acc-btns-container">
          {accountMenuData.map(function(data, index) {
            var activeClass = "";

            if (self.state.focused == index) {
              activeClass = "active";
            }

            return (
              <li
                key={index}
                className={activeClass}
                onClick={self.clicked.bind(self, index)}
              >
                <a href="#" className={data.icon}>
                  {data.name}
                </a>
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
});

ReactDOM.render(<AccountMainMenu />, document.getElementById("app-container"));
Run Code Online (Sandbox Code Playgroud)

Dam*_*ica 342

我使用ES6 模板文字.例如:

const error = this.state.valid ? '' : 'error'
const classes = `form-control round-lg ${error}`
Run Code Online (Sandbox Code Playgroud)

然后只需渲染它:

<input className={classes} />
Run Code Online (Sandbox Code Playgroud)

单线版:

<input className={`form-control round-lg ${this.state.valid ? '' : 'error'}`} />
Run Code Online (Sandbox Code Playgroud)

  • 另外:`<input className = {\`class1 $ {class2} \`}>` (138认同)
  • @CodyMoniz 和这个答案引导我走向正确的方向!我遇到过需要添加多个“变量”类的情况。`className={ \`${ props.variable } ${ props.variabletwo }\` }` 成功了!几个小时不知道如何搜索这个,这个答案弥补了。 (6认同)
  • @unyo 请发表您的评论作为答案,以便我可以投票。它非常值得。我一直在寻找 1 小时这样简单的事情,现在我发现它被埋在了评论中。谢谢你。 (4认同)
  • 这是最好的答案! (4认同)
  • 这应该是最好的答案 (4认同)
  • 我无法理解为什么您要导入一个库(如已接受的答案中所示)来设置一些可以使用 Vanilla JavaScript 设置的类,无论如何,这是一个更高效、更清晰、更易读的解决方案。 (3认同)
  • 这是正确的答案。按照“正确”答案中的建议为此使用依赖项是矫枉过正的。 (3认同)
  • 这是很好的回应,只需模板文字、三元运算符,您就可以使用纯 JavaScript 实现大多数用例。 (2认同)
  • 我一直喜欢这个答案,但不喜欢最后的额外空间,以防出现虚假值。您可以使用“trim()”轻松避免这种情况。 (2认同)

Jac*_*ack 184

我使用类名.例如:

...
    var liClasses = classNames({
      'main-class': true,
      'activeClass': self.state.focused === index
    });

    return (<li className={liClasses}>{data.name}</li>);
...
Run Code Online (Sandbox Code Playgroud)

  • 你不得不引入一个类名库只是为了给一个元素添加两个类,这太糟糕了:( (136认同)
  • @esilva你[当然可以](http://stackoverflow.com/a/32230842/24998) (5认同)
  • @ user959690值得注意的是,它现在[使用Webpack时由NPM安装](https://github.com/JedWatson/classnames/issues/111),所以`从'classnames'中导入classNames然后在组件中使用`className = {classNames(classes.myFirstClass,classes.mySecondClass)}`. (5认同)
  • @ user959690这是一个例子.当你正在做这些事情时,这个库是非常好的,你需要应用或不需要类时有复杂的逻辑.如果您正在做一些简单的事情,那么确保只使用模板,但每个案例都不同,读者应该选择适合自己工作的工具. (4认同)
  • 无需使用外部库,请参阅下面的答案。 (4认同)
  • 库还有其他优点: `var btnClass = classNames({ btn: true, 'btn-pressed': this.state.isPressed, 'btn-over': !this.state.isPressed &amp;&amp; this.state.isHovered }); 返回 &lt;button className={btnClass}&gt;{this.props.label}&lt;/button&gt;;` (2认同)

0xc*_*aff 140

只需使用JavaScript.

<li className={[activeClass, data.klass, "main-class"].join(' ')} />
Run Code Online (Sandbox Code Playgroud)

如果要在对象中添加基于键和值的类,可以使用以下命令:

function classNames(classes) {
  return Object.entries(classes)
    .filter(([key, value]) => value)
    .map(([key, value]) => key)
    .join(' ');
}

const classes = {
  'maybeClass': true,
  'otherClass': true,
  'probablyNotClass': false,
};

const myClassNames = classNames(classes);
// Output: "maybeClass otherClass"

<li className={myClassNames} />
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

const isEnabled = true;
const isChecked = false;

<li className={[isEnabled && 'enabled', isChecked && 'checked']
  .filter(e => !!e)
  .join(' ')
} />
// Output:
// <li className={'enabled'} />
Run Code Online (Sandbox Code Playgroud)

  • 好主意使用`className = {[listOfClasses] .join('')}`它正在为我工​​作谢谢! (5认同)
  • @DougWilhelm 我认为这行不通。它隐式调用 toString 并创建一个逗号分隔的类列表。https://github.com/facebook/react/issues/3138 (3认同)
  • 我更喜欢更性感的 className={[activeClass, data.klass, "main-class"].filter(Boolean).join(' ')} 版本 (3认同)

Jam*_*ber 86

CONCAT

不需要花哨我正在使用CSS模块,这很容易

import style from '/css/style.css';

<div className={style.style1+ ' ' + style.style2} />
Run Code Online (Sandbox Code Playgroud)

这将导致:

<div class="src-client-css-pages-style1-selectionItem src-client-css-pages-style2">
Run Code Online (Sandbox Code Playgroud)

换句话说,两种风格

条件语句

使用if的相同想法会很容易

const class1 = doIHaveSomething ? style.style1 : 'backupClass';

<div className={class1 + ' ' + style.style2} />
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,以及 '-' 名称,即: &lt;nav className={styles.navbar + " " + styles['navbar-default']}&gt; (2认同)
  • 当然可以,只需在上面声明一个变量并有条件地使用它:) (2认同)

Cod*_*niz 37

这可以通过ES6模板文字来实现:

<input className={`class1 ${class2}`}>
Run Code Online (Sandbox Code Playgroud)

  • 这几乎对我有用,我只需要插入 class1 就不会再出现错误,所以它看起来像这样 `&lt;input className={\`${class1} ${class2}\`}&gt;` (7认同)

nig*_*yop 29

您可以创建一个具有多个类名的元素,如下所示:

<li className="class1 class2 class3">foo</li>
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用包含类名的字符串并操作此字符串来更新元素的类名.

var myClassNammes = 'class1 class2 class3';
...
<li className={myClassNames}>foo</li>
Run Code Online (Sandbox Code Playgroud)


jas*_*ard 20

使用 CSS 模块(或 Sass 模块),您也可以将样式隔离到特定组件。

\n

“组件范围的 CSS 允许您以最小的副作用编写传统的、可移植的 CSS:选择器名称冲突或影响其他组件\xe2\x80\x99 样式的担忧消失了。”

\n
import * as styles from "./whatever.module.css"  // css version\nimport * as styles from "./whatever.module.scss" // sass version\n\n<div className={`${styles.class1} ${styles.class2}`}>\n   INSERT YOUR CODE HERE\n</div>\n
Run Code Online (Sandbox Code Playgroud)\n

参考 1 \n参考 2

\n


Hri*_*mov 18

这是你用ES6做到这一点的方法:

className = {`
      text-right
      ${itemId === activeItemId ? 'active' : ''}
      ${anotherProperty === true ? 'class1' : 'class2'}
`}
Run Code Online (Sandbox Code Playgroud)

您可以列出多个类和条件,也可以包含静态类.没有必要添加额外的库.

祝好运 ;)

  • 没必要这么写。这只是一个更好地解释解决方案的例子。并且始终在生产中,您拥有缩小版本:) (3认同)
  • 考虑到所有额外的空白,这会导致非常难看的 HTML。 (2认同)

Huw*_*ies 16

香草JS

不需要外部库 - 只需使用ES6 模板字符串:

<i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
Run Code Online (Sandbox Code Playgroud)

  • @RyanNerd你的意思是"ES6不是香草JS"吗?无论如何,它是,因为vanilla js意味着javascript没有任何框架.ES6是一个较新版本的javascript. - /sf/answers/1430497981/ (7认同)

ash*_*sut 10


一般人都喜欢

<div className={  `head ${style.class1} ${Style.class2}`  }><div>
Run Code Online (Sandbox Code Playgroud)

或者

<div className={  'head ' + style.class1 + ' ' + Style.class2 }><div>
Run Code Online (Sandbox Code Playgroud)

或者

<div className={  ['head', style.class1 , Style.class2].join(' ')  }><div>
Run Code Online (Sandbox Code Playgroud)

但是您可以选择创建一个函数来完成这项工作

function joinAll(...classes) {
  return classes.join(" ")
}
Run Code Online (Sandbox Code Playgroud)

然后这样称呼它:-

<div className={joinAll('head', style.class1 , style.class2)}><div>
Run Code Online (Sandbox Code Playgroud)


Alb*_*rez 9

您可以执行以下操作:

<li key={index} className={`${activeClass} ${data.class} main-class`}></li>
Run Code Online (Sandbox Code Playgroud)

一个简短而简单的解决方案,希望这会有所帮助。


xso*_*ong 8

也许classnames可以帮助你.

var classNames = require('classnames');
classNames('foo', {'xx-test': true, bar: false}, {'ox-test': false}); // => 'foo xx-test'
Run Code Online (Sandbox Code Playgroud)


Yan*_*nga 8

它可以通过https://www.npmjs.com/package/clsx完成:

https://www.npmjs.com/package/clsx

首先安装它:

npm install --save clsx
Run Code Online (Sandbox Code Playgroud)

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

import clsx from  'clsx';
Run Code Online (Sandbox Code Playgroud)

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

<div className={ clsx(classes.class1, classes.class2)}>
Run Code Online (Sandbox Code Playgroud)


ata*_*min 8

这似乎对我有用

<Link className={[classes.button, classes.buttonFirst]}>
Run Code Online (Sandbox Code Playgroud)

  • 在 TypeScript 中,这给了我:“类型‘string[]’不能分配给类型‘string’。” (6认同)

小智 7

您可以像这样创建一个具有多个类名的元素,我尝试了这两种方式,它工作正常......

如果您导入任何 css,那么您可以按照以下方式进行:方式 1:

import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={[styles.class1, styles.class2].join(' ')}>
        { 'text' }
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

方式2:

import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={styles.class1 + ' ' + styles.class2}>
        { 'text' }
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

**

如果您将 css 应用为 internal :

import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={[styles.class1, styles.class2].join(' ')}>
        { 'text' }
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)
import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={styles.class1 + ' ' + styles.class2}>
        { 'text' }
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)
const myStyle = {
  color: "#fff"
};

// React Element using Jsx
const myReactElement = (
  <h1 style={myStyle} className="myClassName myClassName1">
    Hello World!
  </h1>
);

ReactDOM.render(myReactElement, document.getElementById("app"));
Run Code Online (Sandbox Code Playgroud)


小智 6

更多课程添加

... className={`${classes.hello} ${classes.hello1}`...
Run Code Online (Sandbox Code Playgroud)


小智 5

只需添加,我们就可以过滤出空字符串。

className={[
    'read-more-box',
    this.props.className,
    this.state.isExpanded ? 'open' : 'close',
].filter(x => !!x).join(' ')}
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为我们不需要使用外部包来添加多个类。

我个人使用

<li className={`li active`}>Stacy</li> 
or <li className={`li ${this.state.isActive ? 'active' : ''}`}>Stacy<li>
Run Code Online (Sandbox Code Playgroud)

如果需要有条件地添加或删除类,则使用第二个。

  • @TrickOrTreat 不正确。上面的所有示例都将添加两个类(假设 isActive 为 true)。 (2认同)

Ach*_*uru 5

我知道这是一个迟到的答案,但我希望这会对某人有所帮助。

考虑到您在 css 文件“ primary ”、“ font-i ”、“ font-xl ”中定义了以下类

  • 第一步是导入 CSS 文件。
  • 然后

<h3 class = {` ${'primary'} ${'font-i'} font-xl`}> HELLO WORLD </h3>
Run Code Online (Sandbox Code Playgroud)

会做的伎俩!

更多信息:https : //www.youtube.com/watch?v=j5P9FHiBVNo&list=PLC3y8-rFHvwgg3vaYJgHGnModB54rxOk3&index=20


Him*_*han 5


创建一个像这样的函数

function cssClass(...c) {
  return c.join(" ")
}
Run Code Online (Sandbox Code Playgroud)

需要的时候调用它。

<div className={cssClass("head",Style.element,"black")}><div>
Run Code Online (Sandbox Code Playgroud)