我是ReactJS和JSX的新手,我对下面的代码有一个小问题。

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

<li key={index} className={activeClass, data.class, "main-class"}></li>

我的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"));

当前回答

也许类名可以帮助你。

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

其他回答

你可以像这样创建一个有多个类名的元素:

<li className="class1 class2 class3">foo</li>

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

var myClassNammes = 'class1 class2 class3';
...
<li className={myClassNames}>foo</li>

我通常这样使用它:(在你的情况下)

    <li  key={index} className={
        "component " +
        `${activeClass? activeClass: " not-an-active-class "}` +
        `${data.class? " " + data.class : " no-data-class "}`
   } />

当涉及到JSX和(通常)我们有一些json…然后你循环它…组件。map,加上一些条件来检查json属性是否存在,以根据json中的属性值呈现类名。在下面的例子中,component_color和component_dark_shade是来自component.map()的属性

   <div className={
        "component " +
        `${component_color? component_color: " no-color "}` +
        `${component_dark_shade? " " + component_dark_shade : " light "}`
   }/>

输出:<div class="组件无色光" .... 或者:<div class="组件蓝色深色" ....根据地图上的值…

Concat

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

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

<div className={style.style1+ ' ' + style.style2} />

这将导致:

<div class="src-client-css-pages-style1-selectionItem src-client-css-pages-style2">

换句话说,两种风格都有

条件

同样的想法也可以用在“如果”上

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

<div className={class1 + ' ' + style.style2} />

ES6

在过去的一年左右,我一直在使用模板文字,所以我觉得它值得一提,我发现它非常有表现力,易于阅读:

`${class1} anotherClass ${class1}`

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

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

CLSX使这变得简单!

clsx函数可以接受任意数量的参数,每个参数都可以 是对象,数组,布尔或字符串。 ——npmjs.com上的CLSX文档

进口:

import clsx from 'clsx'

使用它:

<li key={index} className={clsx(activeClass, data.class, "main-class")}></li>