classnames 库提供了一个 bind API,用于处理 CSS Module 的情况。
在 Webpack 中用 CSS Module 的方案编译 CSS 文件,后续在 JavaScript 中 import style from 'xxx.css'; 后,style 就是一个对象。这个对象的大体结构如下:
style = {
foo: 'foo-abcde',
bar: 'bar-12345',
// ...
};其中,对象的 key 是原始的 class name,而 value 则是施加 CSS Module 之后得到的唯一名称。
如果直接使用 classnames 的标准 API,那么写起来就需要大量使用 computed property name 的语法,比如:
<div className={classnames({ [style.foo]: true, [style.bar: false ]})} />而使用 bind API,可以事先告知 classnames class name 的对应关系(通过指定 this),后续只需要使用字符串,classnames 就可以自动使用合适的结果:
import classNames from 'classnames/bind';
import styles from './style.css';
const cx = classNames.bind(styles);
const Component = () => (
// result in: className="foo-abcde"
<div className={cx({ foo: true, bar: false })} />
);