You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BEM时className与CSS Modules的正确参数列表语法

解决CSS Modules多类名合并(无第三方库)

看起来你已经摸到CSS Modules的核心点了——每个类名会被编译成独立的唯一标识,所以直接写styles['one two']肯定行不通,因为one和two是两个独立的类,不是一个键。另外styles['one', 'two']是JS逗号运算符的锅,它只会返回最后一个参数,相当于只取了styles['two'],所以才没效果。

既然不想用classNames这类第三方库,这里有几个极简的方案,完全原生就能搞定:

1. 极简版类名合并函数(最推荐)

自己写个几行的小工具函数,比引入第三方库轻量,还能处理条件类:

// 可以放在全局工具文件里复用
const cx = (...classes) => classes.filter(Boolean).join(' ');

// 使用示例
<div className={cx(styles.foo, styles.bar, isActive && styles.active)}></div>

这个函数会自动过滤掉false/undefined这类假值,避免出现多余的空格,比直接用数组join更灵活。

2. 模板字符串直接拼接

如果只是简单的固定类名,用ES6模板字符串也很直观:

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

不过如果有条件类的话,要注意处理空值,比如:

// 避免空字符串导致多余空格
<div className={`${styles.foo} ${isActive ? styles.bar : ''}`.trim()}></div>

3. 解构styles简化写法(适合类名较多的组件)

如果组件里要用很多类名,不想每次都写styles.xxx,可以解构styles(注意BEM的连字符类名要转成驼峰别名):

import styles from './YourComponent.module.css';

// 解构时给连字符类名起别名
const { 
  foo, 
  bar,
  'block__element--modifier': blockElementModifier 
} = styles;

// 使用时直接写别名
<div className={`${foo} ${bar} ${blockElementModifier}`}></div>

为什么你的无效写法行不通?

再补个小解释帮你彻底搞清楚:

  • styles['one two']:CSS Modules会把每个类单独编译,比如one变成Component_one__abc123,two变成Component_two__def456,styles对象里根本没有'one two'这个键,自然返回undefined。
  • styles['one', 'two']:JS里逗号运算符会依次执行表达式,最后返回最后一个的值,所以这里等价于styles['two'],只会应用第二个类。

内容的提问来源于stack exchange,提问作者user2355058

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:35