430

我想根据从父组件传入的内容有条件地显示和隐藏此按钮组,如下所示:

<TopicNav showBulkActions={this.__hasMultipleSelected} />

……

__hasMultipleSelected: function() {
  return false; //return true or false depending on data
}

……

var TopicNav = React.createClass({
render: function() {
return (
    <div className="row">
        <div className="col-lg-6">
            <div className="btn-group pull-right {this.props.showBulkActions ? 'show' : 'hidden'}">
                <button type="button" className="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
                  Bulk Actions <span className="caret"></span>
                </button>
                <ul className="dropdown-menu" role="menu">
                  <li><a href="#">Merge into New Session</a></li>
                  <li><a href="#">Add to Existing Session</a></li>
                  <li className="divider"></li>
                  <li><a href="#">Delete</a></li>
                </ul>
            </div>
        </div>
    </div>
    );
  }
});

然而,{this.props.showBulkActions 什么都没有发生?“显示”:“隐藏”}。我在这里做错什么了吗?

4

21 回答 21

739

花括号在字符串内部,因此它被评估为字符串。他们需要在外面,所以这应该有效:

<div className={"btn-group pull-right " + (this.props.showBulkActions ? 'show' : 'hidden')}>

注意“pull-right”后面的空格。您不想意外地提供类“pull-rightshow”而不是“pull-right show”。括号也需要在那里。

于 2015-05-29T15:18:29.243 回答
116

正如其他人评论的那样,名实用程序是当前推荐的在 ReactJs 中处理条件 CSS 类名的方法。

在您的情况下,解决方案将如下所示:

var btnGroupClasses = classNames(
  'btn-group',
  'pull-right',
  {
    'show': this.props.showBulkActions,
    'hidden': !this.props.showBulkActions
  }
);

...

<div className={btnGroupClasses}>...</div>

作为旁注,我建议您尽量避免同时使用showhidden类,这样代码可能会更简单。最有可能的是,您不需要为默认显示的内容设置类。

2021 附录:为了提高性能,您可以考虑使用 clsx作为替代方案。

于 2016-03-01T09:08:08.633 回答
89

如果您使用的是转译器(例如Babel或 Traceur),您可以使用新的 ES6“模板字符串”。

以下是@spitfire109 的答案,经过相应修改:

<div className={`btn-group pull-right ${this.props.showBulkActions ? 'shown' : 'hidden'}`}>

这种方法允许你做类似的事情,渲染s-is-shownor s-is-hidden

<div className={`s-${this.props.showBulkActions ? 'is-shown' : 'is-hidden'}`}>
于 2016-09-05T13:12:39.543 回答
20

您可以在此处使用字符串文字

const Angle = ({show}) => {

   const angle = `fa ${show ? 'fa-angle-down' : 'fa-angle-right'}`;

   return <i className={angle} />
}
于 2018-07-09T08:14:15.357 回答
16

例如,您可以简单地执行以下操作。

let classNameDependsOnCondtion = i18n.language == 'en' ? "classname" : "";

className={`flex flex-col lg:flex-row list-none ${classNameDependsOnCondtion }`}

或者

className={`flex flex-col lg:flex-row list-none ${i18n.language == 'en' ? "classname" : ""}`}
于 2021-02-08T14:15:13.233 回答
13

如果您只需要一个可选的类名:

<div className={"btn-group pull-right " + (this.props.showBulkActions ? "show" : "")}>
于 2019-08-25T20:35:42.760 回答
12

扩展@spitfire109 的好答案,可以做这样的事情:

rootClassNames() {
  let names = ['my-default-class'];
  if (this.props.disabled) names.push('text-muted', 'other-class');

  return names.join(' ');
}

然后在渲染函数中:

<div className={this.rootClassNames()}></div>

保持 jsx 简短

于 2016-05-02T13:53:46.157 回答
12

或者使用 npm类名。它非常容易和有用,特别是对于构建类列表

于 2017-01-27T13:08:26.920 回答
10

您可以使用 ES6 数组代替类名。答案基于 Axel Rauschmayer 博士的文章:Conditionally added entries inside Array and object literals

<div className={[
                 "classAlwaysPresent", 
                 ...Array.from(condition && ["classIfTrue"])
                ].join(" ")} />
于 2017-09-05T08:41:25.923 回答
9

代替:

<div className="btn-group pull-right {this.props.showBulkActions ? 'show' : 'hidden'}">`

和:

<div className={`btn-group pull-right ${this.props.showBulkActions ? 'show' : 'hidden'}`}
于 2020-06-04T12:40:40.263 回答
7

2019:

React 是湖很多实用程序。但是你不需要任何npm包。只需在某处创建函数classnames并在需要时调用它;

function classnames(obj){
  return Object.entries(obj).filter( e => e[1] ).map( e=>e[0] ).join(' ');
}

或者

function classnames(obj){
 return Object.entries(obj).map( ([k,v]) => v?k:'' ).join(' ');
}

例子

  stateClass= {
    foo:true,
    bar:false,
    pony:2
  }
  classnames(stateClass) // return 'foo pony'


 <div className="foo bar {classnames(stateClass)}"> some content </div>

只为灵感

声明辅助元素并使用它toggle方法

(DOMToken​List)classList.toggle(class,condition)

例子:

const classes = document.createElement('span').classList; 

function classstate(obj){
  for( let n in obj) classes.toggle(n,obj[n]);
 return classes; 
}

于 2019-01-12T17:05:10.950 回答
6

更优雅的解决方案,更利于维护和可读性:

const classNames = ['js-btn-connect'];

if (isSelected) { classNames.push('is-selected'); }

<Element className={classNames.join(' ')}/>
于 2017-07-27T07:37:08.760 回答
3

你可以使用这个:

<div className={"btn-group pull-right" + (this.props.showBulkActions ? ' show' : ' hidden')}>
于 2019-05-12T11:56:57.503 回答
2

当您要附加多个类时,这很有用。您可以使用空格加入数组中的所有类。

const visibility = this.props.showBulkActions ? "show" : ""
<div className={["btn-group pull-right", visibility].join(' ')}>
于 2019-12-18T20:36:37.450 回答
2
<div className={['foo', condition && 'bar'].filter(Boolean).join(' ')} />

.filter(Boolean)从数组中删除“假”值。由于类名必须是字符串,因此除此之外的任何内容都不会包含在的过滤数组中。

console.log(  ['foo', true  && 'bar'].filter(Boolean).join(' ')  )
console.log(  ['foo', false && 'bar'].filter(Boolean).join(' ')  )

上面写成函数:

const cx = (...list) => list.filter(Boolean).join(' ')

// usage:
<div className={cx('foo', condition && 'bar')} />

var cx = (...list) => list.filter(Boolean).join(' ')
console.log(  cx('foo', 1 && 'bar', 1 && 'baz')  )
console.log(  cx('foo', 0 && 'bar', 1 && 'baz')  )
console.log(  cx('foo', 0 && 'bar', 0 && 'baz')  )

于 2020-09-26T10:44:49.487 回答
1

参考@split fire answer,我们可以用模板字面量更新,更具可读性,供参考Checkout javascript template literal

<div className={`btn-group pull-right ${this.props.showBulkActions ? 'show' : 'hidden'}`}>
于 2020-02-17T09:41:25.530 回答
1

这对你有用

var TopicNav = React.createClass({
render: function() {

let _myClasses = `btn-group pull-right {this.props.showBulkActions?'show':'hidden'}`;

return (
            ...
            <div className={_myClasses}>
               ...
            </div>
    );
  }
});
于 2018-09-28T17:45:10.543 回答
0

您可以根据值this.props.showBulkActions动态切换类,如下所示。

<div ...{...this.props.showBulkActions 
? { className: 'btn-group pull-right show' } 
: { className: 'btn-group pull-right hidden' }}>
于 2019-05-09T11:08:15.883 回答
0

你可以使用这个npm 包。它处理所有事情,并具有基于变量或函数的静态和动态类的选项。

// Support for string arguments
getClassNames('class1', 'class2');

// support for Object
getClassNames({class1: true, class2 : false});

// support for all type of data
getClassNames('class1', 'class2', null, undefined, 3, ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

<div className={getClassNames('show', {class1: true, class2 : false})} /> // "show class1"
于 2017-12-03T18:27:34.187 回答
0

我想补充一点,您还可以将变量内容用作课程的一部分

<img src={src} alt="Avatar" className={"img-" + messages[key].sender} />

上下文是机器人和用户之间的聊天,样式根据发送者而变化,这是浏览器的结果:

<img src="http://imageurl" alt="Avatar" class="img-bot">
于 2019-05-15T00:44:04.697 回答
-1

基于参数(如果存在)返回正确类的函数

  getClass(param){
    let podClass = 'classA'
    switch(param.toLowerCase()){
        case 'B':
            podClass  = 'classB'
            break;
        case 'C':
            podClass  = 'classC'
            break;
    }
    return podClass
}

现在只需从要应用相应类的 div 调用此函数。

 <div className={anyOtherClass + this.getClass(param)}

我成功地使用此逻辑将正确的颜色应用于我的引导表行。

于 2020-10-27T08:38:58.223 回答