69

我试图了解 clsx 在将类名分配给 React 中的组件时的一些用途。

构造

className={clsx(classes.menuButton, open && classes.hide)} 

很清楚。它应用 'classes.menuButton',如果布尔值 'open' 的值为真,也应用 'classes.hide'。

我的问题与第二个示例有关:

className={clsx(classes.appBar, {[classes.appBarShift]: open })}

这将应用“classes.appBar”。但是第二个参数是什么意思呢?

4

3 回答 3

104

clsx通常用于有条件地应用给定的className

此语法意味着某些类仅在给定条件评估为时才会应用true

const menuStyle = clsx({
    [classes.root] : true, //always applies
    [classes.menuOpen] : open //only when open === true
})

在此示例[classes.menuOpen]中(将评估为类似的东西randomclassName123)将仅在以下情况下应用open === true


clsx基本上输出一个string插值。所以你不必一定要使用它,尽管这是一种常见的做法。

您可以在官方文档中查看许多受支持的语法

代替

<div className={`${classes.foo} ${classes.bar} ${classes.baz}`} />

你可以像这样使用它

const { foo, bar, baz } = classes
const style = clsx(foo, bar, baz)

return <div className={style} />
于 2019-08-19T13:04:43.003 回答
19

很多人已经解释的很好了。我仍然想添加一个包含 className 的示例。在示例中,您可以看到不同的类,如果给定条件评估为真,则应用这些类。在示例中,您可以应用具有布尔值、布尔变量或比较字符串的类(如果匹配,则返回 true)。该类classes.drawer始终被应用并且不依赖于条件。

className={clsx(classes.drawer, {                  // classes.drawer is applied always
          [classes.drawerOpen]: true,              // classes.drawerOpen is applied always, bool = true
          [classes.drawerClose]: !open,            // you can also use boolean variable
          [classes.drawerRed]: colorVar === 'red', // you can also use string variable
        })}
于 2020-08-28T11:42:01.267 回答
3

classes.appBarShiftopen仅当评估为时才会应用true。如果数组有更多类,如果open评估为true

于 2019-08-19T13:03:01.603 回答