ReactJS将动态类添加到手动类名称


158

我需要将动态类添加到常规类列表中,但不知道该如何做(我正在使用babel),如下所示:

<div className="wrapper searchDiv {this.state.something}">
...
</div>

有任何想法吗?


Answers:


240

您可以使用普通的JavaScript来执行此操作:

className={'wrapper searchDiv ' + this.state.something}

或带有反引号的字符串模板版本:

className={`wrapper searchDiv ${this.state.something}`}

这两种类型当然都是JavaScript,但是第一种模式是传统类型。

无论如何,在JSX中,用大括号括起来的所有内容都将作为JavaScript执行,因此您基本上可以在其中进行任何操作。但是,结合使用JSX字符串大括号对属性来说是行不通的。


如果有多个班级怎么办?
Pardeep Jain

5
如果有多个动态类,则所有动态类都必须来自状态,即无法使用element.classList.add("my-class"); 因此允许:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
Kevin Farrugia

className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' '这行不通。谁能告诉我为什么?
kryptokinght

54

根据项目增长时需要添加的动态类的数量,可能值得在GitHub上查看JedWatson 的classnames实用程序。它使您可以将条件类表示为对象,并返回评估为true的条件类。

因此,以其React文档为例:

render () {

var btnClass = classNames({
  'btn': true,
  'btn-pressed': this.state.isPressed,
  'btn-over': !this.state.isPressed && this.state.isHovered
});

return <button className={btnClass}>I'm a button!</button>;

} 

由于React在状态更改时会触发重新渲染,因此动态类名会自然处理,并与组件的状态保持最新。


5
对这么简单的事情使用classNames是一个过大的杀伤力。避免使用它,而选择dannyjolie的简单答案
清单

2
您确定这很简单吗?几乎总是希望对将哪些类应用于元素完全控制。
Dragas

5
@checklist否则我会争论,classnames包在Gzipping之前为1.1kB(在Gzipping之后为半kB),没有依赖关系,并且为类名操作提供了更为简洁的API。当API具有更高的表达能力时,无需过早地优化如此小的内容。使用标准字符串操作时,必须记住要在每个条件类名称之前或每个标准类名称之后考虑间距。
tomhughes

classNames很棒,我发现随着组件的复杂性增加,读取,添加和修复道具比手动操纵更容易。
MiFiHiBye '18

37

一个简单的可能语法为:

<div className={`wrapper searchDiv ${this.state.something}`}>

25

这是Dynamic className的最佳选择,就像我们在Javascript中一样进行一些串联。

     className={
        "badge " +
        (this.state.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }

这是没有任何掉毛问题的最佳解决方案。像魅力一样工作。谢谢。
Royal.O


2

尝试使用钩子:

        const [dynamicClasses, setDynamicClasses] = React.useState([
    "dynamicClass1", "dynamicClass2
]);

并将其添加到className属性中:

<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>

添加类:

    const addClass = newClass => {
       setDynamicClasses([...dynamicClasses, newClass])
    }

删除班级:

        const deleteClass= classToDelete => {

           setDynamicClasses(dynamicClasses.filter(class = > {
             class !== classToDelete
           }));

        }

1

您可以使用 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', ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

<div className={getClassNames({class1: true, class2 : false})} />

1
getBadgeClasses() {
    let classes = "badge m-2 ";
    classes += (this.state.count === 0) ? "badge-warning" : "badge-primary";
    return classes;
}

<span className={this.getBadgeClasses()}>Total Count</span>

-1
className={css(styles.mainDiv, 'subContainer')}

此解决方案已在React SPFx中进行了尝试和测试。

还添加import语句:

import { css } from 'office-ui-fabric-react/lib/Utilities';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.