如何在 React 中使用 clsx

mil*_*ort 57 class-names reactjs jss

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

构造

className={clsx(classes.menuButton, open && classes.hide)} 
Run Code Online (Sandbox Code Playgroud)

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

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

className={clsx(classes.appBar, {[classes.appBarShift]: open })}
Run Code Online (Sandbox Code Playgroud)

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

Dup*_*cas 80

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

这种语法意味着只有在给定条件评估为时才会应用某些类 true

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

在这个例子中[classes.menuOpen](它将评估为类似的东西randomclassName123)只会在以下情况下应用open === true


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

有很多支持的语法,您可以在官方文档中查看

代替

<div className={`${classes.foo} ${classes.bar} ${classes.baz}`} />
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它

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

return <div className={style} />
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。如果我理解正确的话,那么 'open &amp;&amp; classes.menuOpen' 与 '[classes.menuOpen] : open' 具有完全相同的效果。 (6认同)
  • 是的。您可以在[此处](https://www.npmjs.com/package/clsx)检查“clsx”的所有可能的语法 (2认同)

Ame*_*mel 12

很多人已经解释的很好了。我仍然想添加一个包含 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
        })}
Run Code Online (Sandbox Code Playgroud)

  • 您能为您的代码添加一些解释吗?[纯代码答案可能属于“质量非常低”......并且是删除的候选者......我们一直宣称我们不是代码工厂。我们是授人以渔的人。仅代码答案只能养活一个人一天](http://meta.stackexchange.com/questions/148272/is-there-any-benefit-to-allowing-code-only-answers-while-blocking-code -仅问题) (2认同)