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

Man*_*023 128 css reactjs

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

<div className="wrapper searchDiv {this.state.something}">
...
</div>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢

dan*_*lie 194

你可以这样做,普通的javascript:

__CODE__

或字符串模板版本

__CODE__ 用反叛.

这两种类型当然只是javascript,但第一种模式是传统类型.无论如何,在JSX中,用大括号括起来的任何东西都是以javascript的形式执行的,所以你基本上可以做任何你想做的事.但是将JSX字符串大括号组合起来是一个禁忌的属性.

  • 在有多个动态类的情况下,所有动态类都必须来自状态,即不可能使用`element.classList.add(“ my-class”)`; 因此允许:className = {\ wrapper searchDiv $ {this.state.something?“ my-class”:“”} $ {this.state.somethingElse吗?“ my-other-class”:“”} \`}` (2认同)

Bra*_*rst 48

根据您在项目增长时需要添加的动态类的数量,可能值得在GitHub上查看JedWatson 的类名实用程序.它允许您将条件类表示为对象,并返回评估为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>;

} 
Run Code Online (Sandbox Code Playgroud)

由于React在状态更改时触发重新呈现,因此您的动态类名称会自然处理并与组件的状态保持同步.

  • 将classNames用于这么简单的事情是一种矫枉过正.避免使用它并选择dannyjolie的简单答案 (5认同)
  • @checklist我会争辩说,在Gzipping之前,classnames包是1.1kB(在Gzipping之后是半个kB),没有依赖关系,并为类名操作提供了更清晰的API.当API更具表现力时,没有必要过早地优化这么小的东西.使用标准字符串操作时,您必须记住在每个条件类名称之前或每个标准类名之后考虑间距. (3认同)
  • 你确定这是一件简单的事吗?您总是希望对要应用于元素的类进行细粒度的完全控制. (2认同)

oli*_*pol 36

一个简单的可能语法是:

<div className={`wrapper searchDiv ${this.state.something}`}>
Run Code Online (Sandbox Code Playgroud)


小智 20

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

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

  • 这是最好的解决方案,没有任何掉毛问题。像魅力一样工作。谢谢你。 (2认同)

Iht*_*eer 11

[2022 年 4 月 21 日更新:在反引号前后添加花括号以防止错误]

您可以简单地使用条件来申请您想要的特定类别

<div className={`wrapper searchDiv ${this.state.something ? "class that you want" : ""}`}>
Run Code Online (Sandbox Code Playgroud)

如果你想使用 makeStyle 类,你可以像这样使用它

<div className={`wrapper searchDiv ${this.state.something ? classes.specifiedClass : ""}`}>

Run Code Online (Sandbox Code Playgroud)


小智 8

使用钩子试试这个:

const [dynamicClasses, setDynamicClasses] = React.useState([
    "dynamicClass1", "dynamicClass2"
]);
Run Code Online (Sandbox Code Playgroud)

并将其添加到 className 属性中:

<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>
Run Code Online (Sandbox Code Playgroud)

添加类:

    const addClass = newClass => {
       setDynamicClasses([...dynamicClasses, newClass])
    }
Run Code Online (Sandbox Code Playgroud)

删除类:

        const deleteClass= classToDelete => {

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

        }
Run Code Online (Sandbox Code Playgroud)


Ser*_*rev 7

如果您需要根据状态条件出现的样式名称,我更喜欢使用这种结构:

<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>
Run Code Online (Sandbox Code Playgroud)


小智 6

不要想这么复杂的解决方案。

这是解决您问题的最简单方法。

<div className={`wrapper searchDiv ${this.state.something}`}>
   ...
</div>
Run Code Online (Sandbox Code Playgroud)