如何动态地将一个类添加到手动类名中?

IT技术 css reactjs
2021-04-16 01:06:39

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

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

有任何想法吗?

6个回答

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

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

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

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

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

无论如何,在 JSX 中,用大括号括起来的任何东西都是作为 JavaScript 执行的,所以你基本上可以在那里做任何你想做的事。但是结合 JSX 字符串大括号对于属性来说是行不通的

className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' '这不起作用。谁能告诉为什么?
2021-05-28 01:06:39
在多个动态类的情况下,所有动态类都必须来自状态,即不能使用element.classList.add("my-class"); 因此允许:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
2021-05-30 01:06:39
@kryptokinght 你可以试试 className={'wrapper searchDiv ' + (this.state.isTrue ? 'my-class' : ' ')}
2021-05-31 01:06:39
如果有多个class怎么办?
2021-06-01 01:06:39

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

因此,作为其 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 在状态更改时会触发重新渲染,因此您的动态类名称会自然处理并与组件的状态保持同步。

classNames 很棒,我发现随着组件越来越复杂,读取、添加和修复 props 比手动操作更容易。
2021-05-28 01:06:39
@checklist 我会争辩说,类名包在 Gzipping 之前是 1.1kB(在 Gzipping 之后是半 kB),没有依赖关系,并为类名操作提供了更清晰的 API。当 API 更具表现力时,没有必要过早地优化如此小的东西。使用标准字符串操作时,您必须记住在每个条件类名称之前或每个标准类名称之后考虑间距。
2021-06-14 01:06:39
你确定这是一件简单的事情?您几乎总是希望对应用于元素的类进行细粒度的完全控制。
2021-06-15 01:06:39
将 classNames 用于如此简单的事情是一种矫枉过正。避免使用它并选择 dannyjolie 的简单答案
2021-06-19 01:06:39

一个简单的可能的语法是:

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

这是 Dynamic className 的最佳选项,只需像我们在 Javascript 中那样进行一些连接即可。

     className={
        "badge " +
        (this.state.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }
这是最好的解决方案,没有任何掉毛问题。像魅力一样工作。谢谢你。
2021-06-07 01:06:39

使用钩子试试这个:

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

        }
默认情况下...扩展运算符实际上会通过,逗号连接字符串例如wrapper searchDiv ${[...'c','as']}=>"wrapper searchDiv c,as"
2021-05-26 01:06:39