如今处处都追求效率开发,所谓存在即合理,各类各样的开源包/项目火热,也是由于他们大大解决了以前复杂的逻辑.做为榜上前10的热门包:classnames.还真须要了解了解它才能仗'包'走天涯css
官方定义: A simple JavaScript utility for conditionally joining classNames together.react
理解: 帮助你在React项目更好地使用classNamegit
在认识classnames以前,你可能会有一个疑问: 我发誓我如今react自带的className
用得挺好的,还须要引入classnames吗?github
先举个小反例吧npm
错误数组
import styles from './style.less' <div className={styles.div styles.div1}></div> //不容许存在多个变量
正确antd
import styles from './style.css' import classNames from 'classnames' let divClass = classNames({ 'div': true, 'div1': true }) <div className={divClass}></div> //输出class="div div1"
固然,机智的你固然想到了能够用字符串模板解决less
<div className={`${styles.div} ${styles.div1}`}></div>
"干吗弄这么麻烦?直接import './style.css'
不就好了?"ui
import from './styles.css' <div className="div div1></div>
大兄弟所言甚是.上面只是我在项目中使用antd-pro
CSS Modules编码方式this
简单介绍一下什么是CSS Modules
:
因为项目开发逐渐庞大过程当中,对于样式有两个不得不考虑的问题(这也是CSS Modules
出现的问题)
全局污染 —— CSS 文件中的选择器是全局生效的,不一样文件中的同名选择器,根据 build 后生成文件中的前后顺序,后面的样式会将前面的覆盖;
选择器复杂 —— 为了不上面的问题,咱们在编写样式的时候不得不当心翼翼,类名里会带上限制范围的标识,变得愈来愈长,多人开发时还很容易致使命名风格混乱,一个元素上使用的选择器个数也可能愈来愈多。
归根结底就是命名惹的祸
而CSS Module
就是在对className转换的时候加入必定的规则,使得样式名自动添加一个hash值,确保惟一性
// example.less .title { } <div className={styles.title}>CSS Modules</div>; //转换后 =====> <div class="title___3TqAx">title</div>
以上就是CSS Modules
的基本原理.更多用法能够参考:《Ant Design Pro - 样式》
固然说那么多,也是想证实一下classnames
的优秀
//基础用法 classNames('foo', 'bar'); // => 'foo bar' classNames('foo', { bar: true }); // => 'foo bar' classNames({ 'foo-bar': true }); // => 'foo-bar' classNames({ 'foo-bar': false }); // => '' classNames({ foo: true }, { bar: true }); // => 'foo bar' classNames({ foo: true, bar: true }); // => 'foo bar' // 各类各样属性结合 classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux' // 一些不存在/空的属性会自动忽略 classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1' //数组会遍历输出 var arr = ['b', { c: true, d: false }]; classNames('a', arr); // => 'a b c' //字符串模板方式 let buttonType = 'primary'; classNames({ [`btn-${buttonType}`]: true });
经过状态控制样式的添加删除,简直不要太方便.今后告别removeClass
之类方法
动态控制按钮样式
constructor(arg){ super(arg) this.state = { isPressed: false, isHovered: true } } render(){ var btnClass = classNames({ btn: true, 'btn-pressed': this.state.isPressed, 'btn-over': !this.state.isPressed && this.state.isHovered }); return( <div> <button className={btnClass}>按钮</button> </div> ) } // 输出====> <button class="btn btn-over">按钮</button>
CSS Modules介绍:《css-modules》
import classNames from 'classnames/bind'; let styles = { key1: 'div', key2: 'div1', key3: 'div2' }; let cssModulesClass = classNames.bind(styles); let divClassName = cssModulesClass('key1', ['key2']); <div className={divClassName}></div>// => "div div1"
更多用法能够参考:《npm-classnames》