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

时间:2015-12-30 01:44:22

标签: javascript css reactjs ecmascript-6

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

我正在尝试在每个className的{​​{1}}属性中添加多个类:

li

我的React组件是:

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

35 个答案:

答案 0 :(得分:278)

我使用ES6 template literals。例如:

const error = this.state.valid ? '' : 'error'
const classes = `form-control round-lg ${error}`

然后只渲染它:

<input className={classes} />

单线版:

<input className={`form-control round-lg ${this.state.valid ? '' : 'error'}`} />

答案 1 :(得分:149)

我使用classnames。例如:

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

    return (<li className={liClasses}>{data.name}</li>);
...

答案 2 :(得分:118)

只需使用JavaScript。

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

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

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} />

甚至更简单:

const isEnabled = true;
const isChecked = false;

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

答案 3 :(得分:73)

的毗连

不需要花哨我正在使用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">

换句话说,两种风格

条件

使用if的

可以很容易地使用相同的想法
const class1 = doIHaveSomething ? style.style1 : 'backupClass';

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

答案 4 :(得分:27)

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

<input className={`class1 ${class2}`}>

答案 5 :(得分:25)

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

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

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

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

答案 6 :(得分:15)

这是你用ES6做到的方法:

className = {`
      text-right
      ${itemId === activeItemId ? 'active' : ''}
      ${anotherProperty === true ? 'class1' : 'class2'}
`}

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

祝你好运;)

答案 7 :(得分:11)

Vanilla JS

无需外部库 - 只需使用ES6 template strings

<i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>

答案 8 :(得分:8)

也许classnames可以帮到你。

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

答案 9 :(得分:8)


一般人都喜欢

<div className={  `head ${style.class1} ${Style.class2}`  }><div>

<div className={  'head ' + style.class1 + ' ' + Style.class2 }><div>

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

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

function joinAll(...classes) {
  return classes.join(" ")
}

然后这样称呼它:-

<div className={joinAll('head', style.class1 , style.class2)}><div>

答案 10 :(得分:5)

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

考虑到您已经在css文件' primary ',' font-i ',' font-xl '中定义了以下类

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

<h3 class = {` ${'primary'} ${'font-i'} font-xl`}> HELLO WORLD </h3>

会成功的!

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

答案 11 :(得分:4)

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

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

答案 12 :(得分:4)

您可以执行以下操作:

Select, Employee_id, First_name, Hire_Date, (Sysdate-Hire_Date) as year_Exp
from employees;

一个简短的解决方案,希望对您有所帮助。

答案 13 :(得分:3)

晚会,但为什么要使用第三方解决这么简单的问题?

你可以像@Huw Davies所提到的那样 - 最好的方式

1. <i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
2. <i className={[styles['foo-bar-baz'], 'fa fa-user', 'fa-2x'].join(' ')}

两者都很好。但是对于大型应用来说,写作会变得复杂。为了使它达到最优,我做了同样的事情,但把它放在一个帮助类

使用我的下面帮助函数,允许我将逻辑分开以备将来编辑,并且还提供了多种添加类的方法

classNames(styles['foo-bar-baz], 'fa fa-user', 'fa-2x')

classNames([styles['foo-bar-baz], 'fa fa-user', 'fa-2x'])

这是我的助手功能。我把它放在helper.js中,我保留了所有常用方法。作为一个如此简单的功能,我避免使用第三方来保持控制

export function classNames (classes) {
    if(classes && classes.constructor === Array) {
        return classes.join(' ')
    } else if(arguments[0] !== undefined) {
        return [...arguments].join(' ')
    }
    return ''
}

答案 14 :(得分:2)


创建这样的函数

function cssClass(...c) {
  return c.join(" ")
}

在需要时调用它。

<div className={cssClass("head",Style.element,"black")}><div>

答案 15 :(得分:2)

您可以使用数组,然后使用空格将它们连接起来。

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

这将导致:

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

答案 16 :(得分:2)

这似乎对我有用

<Link className={[classes.button, classes.buttonFirst]}>

答案 17 :(得分:2)

如果您不想导入其他模块,则此功能与classNames模块类似。

function classNames(rules) {
    var classes = ''

    Object.keys(rules).forEach(item => {    
        if (rules[item])
            classes += (classes.length ? ' ' : '') + item
    })

    return classes
} 

你可以像这样使用它:

render() {
    var classes = classNames({
        'storeInfoDiv': true,  
        'hover': this.state.isHovered == this.props.store.store_id
    })   

    return (
        <SomeComponent style={classes} />
    )
}

答案 18 :(得分:1)

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

如果您导入任何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>
    );
  }
}

方式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>
    );
  }
}

**

如果您将CSS作为内部应用:

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"));
.myClassName {
  background-color: #333;
  padding: 10px;
}
.myClassName1{
  border: 2px solid #000;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.0/umd/react-dom.production.min.js"></script>
<div id="app">
  
</div>

答案 19 :(得分:1)

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

我个人使用

<li className={`li active`}>Stacy</li> 
or <li className={`li ${this.state.isActive ? 'active' : ''}`}>Stacy<li>

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

答案 20 :(得分:1)

要添加更多类, className = {public Post Create(Guid blogId) { var blog = _context.Blogs.Include(t=>t.Posts).FirstOrDefault(x => x.Id == blogId); var postFactory = new PostFactory(); var post = postFactory.CreateNew(Guid.NewGuid()); blog.Posts.Add(post); _context.SaveChanges(); return post; }

答案 21 :(得分:1)

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

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

首先安装它:

npm install --save clsx

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

import clsx from  'clsx';

然后在组件中使用导入的功能:

<div className={ clsx(classes.class1, classes.class2)}>

答案 22 :(得分:1)

使用facebook's TodoTextInput.js example

render() {
    return (
      <input className={
        classnames({
          edit: this.props.editing,
          'new-todo': this.props.newTodo
        })}
        type="text"
        placeholder={this.props.placeholder}
        autoFocus="true"
        value={this.state.text}
        onBlur={this.handleBlur}
        onChange={this.handleChange}
        onKeyDown={this.handleSubmit} />
    )
  } 

用普通的vanilla js代码替换类名将如下所示:

render() {
    return (
      <input
        className={`
          ${this.props.editing ? 'edit' : ''} ${this.props.newTodo ? 'new-todo' : ''}
        `}
        type="text"
        placeholder={this.props.placeholder}
        autoFocus="true"
        value={this.state.text}
        onBlur={this.handleBlur}
        onChange={this.handleChange}
        onKeyDown={this.handleSubmit} />
    )
  }

答案 23 :(得分:1)

当我有许多不同的课程时,我发现以下内容很有用。

过滤器删除任何null值,然后联接将所有剩余值放入一个用空格分隔的字符串中。

const buttonClasses = [
    "Button", 
    disabled ? "disabled" : null,
    active ? "active" : null
].filter((class) => class).join(" ")

<button className={buttonClasses} onClick={onClick} disabled={disabled ? disabled : false}>

答案 24 :(得分:0)

clsx 让这一切变得简单!

<块引用>

"clsx 函数可以接受任意数量的参数,每个参数都可以 可以是对象、数组、布尔值或字符串。"

-- npmjs.com 上的 clsx 文档

导入:

import clsx from 'clsx'

使用它:

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

答案 25 :(得分:0)

使用 jbcn 模块。 (BEM 支持)

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

示例:

const classNames = jbcn({ 
    btn: { 
        alpha: true, 
        beta: true, 
        gamma: false 
    } 
});

// ==> "btn btn--alpha btn--beta"
const classNames = jbcn({
    expand: true,
    hide: false,

    btn: { 
        alpha: true, 
        beta: true, 
        gamma: false 
    } 
});

// ==> "expand btn btn--alpha btn--beta"

答案 26 :(得分:0)

只需使用逗号!

const useStyles = makeStyles((theme) => ({
 rightAlign: {
  display: 'flex',
  justifyContent: 'flex-end',
 },
 customSpacing: {
  marginTop: theme.spacing(2.5),
 },
)};

<div className={(classes.rightAlign, classes.customSpacing)}>Some code</div>

答案 27 :(得分:0)

我使用了这个语法

    <div
      className={[
        "d-inline-flex justify-content-center align-items-center ",
        withWrapper && `ft-icon-wrapper ft-icon-wrapper-${size}`,
        wrapperClass,
      ].join(" ")}
    >
      <img
        className={`ft-icon ft-icon-${size} ${iconClass}`}
        alt={id}
        src={icon}
      />
    </div>

答案 28 :(得分:0)

如果您想使用双重条件css模块,总是会造成混淆,所以我建议您遵循这种模式

import styles from "./styles.module.css"

const Conditonal=({large, redColor}) => {
 return(
  <div className={[large && styles.large] + [redColor && styles.color]>
   ...
  </div>
 )
}

export default Conditonal

,如果它只是一个带有两个类名的条件语句,请使用此

import styles from "./styles.module.css"

const Conditonal=({redColor}) => {
 return(
  <div className={styles.large + [redColor && styles.color]>
   ...
  </div>
 )
}

export default Conditonal

答案 29 :(得分:0)

我通常这样使用它:(以您为例)

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

在JSX上(通常),我们有一些json ...而不是您将其循环... 组件地图,还有一些条件来检查是否存在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="component no-color light" .... 或者:<div class="component blue dark" ....取决于地图中的值...

答案 30 :(得分:0)

我正在使用React 16.6.3和@Material UI 3.5.1,并且能够使用className中的数组,例如className={[classes.tableCell, classes.capitalize]}

因此在您的示例中,以下内容将相似。

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

答案 31 :(得分:0)

bind classNames导入了导入到组件的css模块。

import classNames from 'classnames'; 
import * as styles from './[STYLES PATH];
const cx = classNames.bind(styles); 

classnames允许以声明方式为React元素声明className

例如:

<div classNames={cx(styles.titleText)}> Lorem </div>

<div classNames={cx('float-left')}> Lorem </div> // global css declared without css modules
<div classNames={cx( (test === 0) ?
             styles.titleText : 
             styles.subTitleText)}>  Lorem </div> // conditionally assign classes

<div classNames={cx(styles.titleText, 'float-left')}> Lorem </div> //combine multiple classes

答案 32 :(得分:0)

这就是我的所作所为:

组件:

const Button = ({ className }) => (
  <div className={ className }> </div>
);

调用组件:

<Button className = 'hashButton free anotherClass' />

答案 33 :(得分:0)

我使用rc-classnames包。

// ES6
import c from 'rc-classnames';

// CommonJS
var c = require('rc-classnames');

<button className={c('button', {
  'button--disabled': isDisabled,
  'button--no-radius': !hasRadius
})} />

您可以添加任何格式的类(Array,Object,Argument)。数组或参数中的所有truthy值加上等于true的对象中的键都合并在一起。

例如:

ReactClassNames('a', 'b', 'c') // => "a b c"
ReactClassNames({ 'a': true, 'b': false, c: 'true' }) // => "a c"
ReactClassNames(undefined, null, 'a', 0, 'b') // => "a b"

答案 34 :(得分:-1)

使用https://www.npmjs.com/package/classnames

从“类名”中导入类名;

  1. 可以使用逗号分隔的多个类:

    <li className={classNames(classes.tableCellLabel, classes.tableCell)}>Total</li>
    
  2. 可以使用多个逗号分隔并带有条件的类:

    <li className={classNames(classes.buttonArea, !nodes.length && classes.buttonAreaHidden)}>Hello World</li> 
    

使用数组作为classNames的道具也可以,但是会发出警告,例如

className={[classes.tableCellLabel, classes.tableCell]}