使用 css module如何定义多个样式名称

IT技术 javascript css reactjs
2021-04-21 10:58:32

我正在尝试使用 css module为元素使用多个类。我该怎么做呢?

function Footer( props) {
    const { route } = props;
    return (
        <div className={styles.footer}>
            <div className={styles.description, styles.yellow}>
              <p>this site was created by me</p>
            </div>
            <div className={styles.description}>
              <p>copyright nz</p>
            </div>
        </div>
    );
}
6个回答

您可以使用 css module添加多个类,如下所示:

className={`${styles.description} ${styles.yellow}`}

例如

function Footer( props) {
    return (
        <div className={styles.footer}>
            <div className={`${styles.description} ${styles.yellow}`}>
              <p>this site was created by me</p>
            </div>
        </div>
    );
}

使用react-css-modules你可以使用普通的类名语法:

<div styleName='description yellow'>

并且您allowMultiple: true为多个类指定

谢谢@Golinmarq 现在更新
2021-05-26 10:58:32
请您具体说一下,我们应该在哪里添加allowMultiple: true我找不到任何与之相关的内容
2021-05-28 10:58:32
您可以使用 ES2015 语法。这将是${styles.class1} ${styles.class2}
2021-05-29 10:58:32
似乎在上一个版本的 react-create-app 中它不再起作用,它会触发:“不允许重复道具”
2021-06-02 10:58:32
@NorayrGhukasyanexport default CSSModules(Footer, styles, {allowMultiple: true} )检查这里
2021-06-10 10:58:32

您可以使用将与空格连接的数组。IE

<div className={[styles.App, styles.bold, styles['d-flex-c']].join(' ')}>

我更喜欢使用像@steven iseki建议的模板文字,因为添加和删除类更容易,而不必${}每次都将它们包装起来

但是如果你出于某种原因向很多元素添加了很多类,你可以编写一个更高阶的函数来使它更容易

import React from 'react';
import styles from './Person.module.css';

console.log(styles);
// sample console output =>
// {
//   App: 'App_App__3TjUG',
//   'd-flex-c': 'App_d-flex-c__xpDp1',
// }


// func below returns a function that takes a list of classes as an argument
// and turns it in an array with the spread operator and reduces it into a spaced string

const classLister = styleObject => (...classList) =>
  classList.reduce((list, myClass) => {
    let output = list;
    if (styleObject[myClass]) {
      if (list) output += ' '; // appends a space if list is not empty
      output += styleObject[myClass]; 
      //Above: append 'myClass' from styleObject to the list if it is defined
    }
    return output;
 }, '');

const classes = classLister(styles); 
// this creates a function called classes that takes class names as an argument
// and returns a spaced string of matching classes found in 'styles'

用法

<div className={classes('App', 'bold', 'd-flex-c')}>

看起来非常整洁和可读。

当渲染到 DOM 时,它变成

<div class="App_App__3TjUG App_d-flex-c__xpDp1">
/* Note: the class 'bold' is automatically left out because
   in this example it is not defined in styles.module.css 
   as you can be observe in console.log(styles) */

正如预期的那样

它可以通过将条件生成的类放在一个数组中来与条件一起使用,该数组用作类的参数,通过 ... 展开运算符

事实上,在回答这个问题时,我决定发布一个 npm module,因为为什么不呢。

得到它

npm install css-module-class-lister
@VladyslavGoloshchapov“因为添加和删除类更容易,而不必${}每次都包装它们”。
2021-05-23 10:58:32
惊人的。太感谢了。
2021-05-24 10:58:32
为什么不只是${styles.description} ${styles.yellow}像 svnm 建议的那样className={ } ???
2021-06-19 10:58:32

我强烈推荐使用classnames包。它非常轻巧(缩小了 600 字节)并且没有依赖项:

import classnames from 'classnames';

Function footer(props) {
  ...
  <div className={classnames(styles.description, styles.yellow)}>
}

它甚至还有一个额外的好处,即能够有条件地添加类名(例如,附加一个深色主题类),而不必连接可能会意外添加undefinedfalse类的字符串

  <div className={classnames(styles.description, {styles.darkTheme: props.darkTheme })}>

您应该添加方括号以使 classNames 成为数组,并删除 ',' 添加join()

function Footer( props) {
    const { route } = props;
    return (
        <div className={styles.footer}>
            <div className={ [styles.description, styles.yellow].join(' ') }>
              <p>this site was created by me</p>
            </div>
            <div className={styles.description}>
              <p>copyright nz</p>
            </div>
        </div>
    );
}

作为除远郝笞肮答案,下面的功能使得它更容易与工作:

const classes = (classNames: Array<string> | string): string => classnames((Array.isArray(classNames) ? classNames : classNames.split(' ')).map(x => styles[x]));

它的作用是获取一个数组或一个字符串(然后将其拆分为一个字符串数组),并返回一个最终类名(范围限定为当前module,因为它styles当然使用导入的对象)。

你像这样使用它:

<div className={classes(['description', 'dark-theme', 'many', 'more', 'class-names'])}>

或者,如果您愿意,指定一个字符串(在使用多个类的情况下很方便,例如使用 TailwindCSS):

<div className={classes('description dark-theme many more class-names')}>