一、classnames

现在到处都追求效率开发,所谓存在即合理,各种各样的开源包/项目火热,也是因为他们大大解决了之前复杂的逻辑.作为榜上前10的热门包:classnames.还真需要了解了解它才能仗'包'走天涯

官方定义: A simple JavaScript utility for conditionally joining classNames together.

理解: 帮助你在React项目更好地使用className

二、使用方法

在认识classnames之前,你可能会有一个疑问: 我发誓我现在react自带的`className`用得挺好的,还需要引入classnames吗?

先举个小反例吧

错误

import styles from './style.less'

<div className={styles.div styles.div1}></div> //不允许存在多个变量

正确

import styles from './style.css'
import classNames from 'classnames' let divClass = classNames({
'div': true,
'div1': true
}) <div className={divClass}></div>
//输出class="div div1"

当然,机智的你当然想到了可以用字符串模板解决

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

"干嘛弄这么麻烦?直接import './style.css'不就行了?"

import from './styles.css'

<div className="div div1></div>

大兄弟所言甚是.上面只是我在项目中使用antd-proCSS Modules编码方式

简单介绍一下什么是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语法

```
//基础用法
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 });


通过状态控制样式的<b>添加删除</b>,简直不要太方便.从此告别`removeClass`之类方法 <h4>结合React用法</h4>
动态控制按钮样式

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>
)

}

// 输出====> 按钮


<h4>结合`CSS Modules`用法</h4>
CSS Modules介绍:<a href="https://github.com/css-modules/css-modules" target="_blank">《css-modules》</a>

import classNames from 'classnames/bind';

let styles = {

key1: 'div',

key2: 'div1',

key3: 'div2'

};

let cssModulesClass = classNames.bind(styles);

let divClassName = cssModulesClass('key1', ['key2']);

// => "div div1"
```

更多用法可以参考:《npm-classnames》

每日质量NPM包-classnames的更多相关文章

  1. 每日质量NPM包复制_copy-to-clipboard

    一.copy-to-clipboard 官方定义: Simple module exposing copy function 理解: 一个超级简单的复制功能,并且这种方法适用于通过别的事件触发复制功能 ...

  2. 每日质量NPM包事件绑定_bindme(详解React的this)

    一.bindme 官方定义: is a helper to bind a list of methods to an object reference 理解: 因为不推荐在render()里构建函数, ...

  3. 每日质量NPM包模态框_react-modal

    一.react-modal 官方定义: Accessible modal dialog component for React.JS 理解: 一个容易使用的React模态框组件 二.用法 有时候我们不 ...

  4. 每日质量NPM包拖拽文件上传_react-dropzone

    一.react-dropzone 官方定义: Simple HTML5-compliant drag'n'drop zone for files built with React.js. 理解: 一个 ...

  5. 如何自己写一个公用的NPM包

    以markdown-clear,创建过程为例,讲解整个NPM包创建和发布流程 1 如何创建一个包 1.1 创建并使用一个工程 在GitHub上新建一个仓库,其名markdown-clear clone ...

  6. 【vue系列之三】从一个vue-pdf-shower,说说vue组件和npm包

    前言 从去年年初开始,自己便下决心要写一个vue系列的博客,但时至今日,才写系列的第三篇博客,想来甚是惭愧. 但是慢归慢,每一篇都要保证质量,以及要写出自己的心路历程,防止自己工作中填的坑再让读者走一 ...

  7. 从0到1发布一个npm包

    从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...

  8. Github 持续化集成 工作流 Npm包自动化发布

    Github 持续化集成 工作流 Npm包自动化发布 简介   持续集成指的是,频繁地(一天多次)将代码集成到主干. 它的好处主要有两个: 快速发现错误.每完成一点更新,就集成到主干,可以快速发现错误 ...

  9. npm包与gem包--在线&离线安装

    目录 NPM 在线 离线 GEM 在线 离线 NPM NPM,即为Node的包管理工具,官网为 https://www.npmjs.com/,我们可以在站内搜索所需要的NPM包,了解相关的使用规则 安 ...

随机推荐

  1. js定时器优化

    在js中如果打算使用setInterval进行倒数,计时等功能,往往是不准确的,因为setInterval的回调函数并不是到时后立即执行,而是等系统计算资源空闲下来后才会执行.而下一次触发时间则是在s ...

  2. [转载] 关于出现“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式”错误的可能原因

    1. 对于该问题确实存在UNION前后SELECT语句中的列数不同导致:2. 以下为个人遇到的一种可能:在项目开发中由于有张表是动态的,即有个基础表,其他的表按年月根据基础表来生成动态表,动态表结构和 ...

  3. python初学者必看的学习路线

    Python是近几年比较火的编程语言之一,因为人工智能的火爆,让很多人都想从事python开发.很多零基础学员在学习python的时候都会走一些弯路,下面小编就为大家分享python学习路线图,帮助零 ...

  4. java初学者必看的学习路线

    不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...

  5. Django框架----命名空间模式

    命名空间模式 即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL. 举个例子: project中的urls.py from django.conf.urls im ...

  6. Java 持久化操作之 --XML

    摘自:http://www.cnblogs.com/lsy131479/p/8728767.html 1)有关XML简介 XML(EXtensible Markup Language)可扩展标记语言 ...

  7. Qt发布可执行程序

    在Qt Creator下用release跑一遍程序,生成相应的EXE文件.   在Qt Creator下编译好的release下的 youProgramName.exe 拷贝到一个文件夹下面:   在 ...

  8. 八大排序算法之七—堆排序(Heap Sort)

    堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素) ...

  9. Cheerleaders UVA - 11806

    题目大意是: 在一个m行n列的矩形网格中放置k个相同的石子,问有多少种方法?每个格子最多放一个石子,所有石子都要用完,并且第一行.最后一行.第一列.最后一列都要有石子. 容斥原理.如果只是n * m放 ...

  10. Java开发人员必会的基本Linux命令(转)

    原文链接:http://www.cnblogs.com/zhuawang/p/5212809.html http://explainshell.com/ 本文并不会对所有命令进行详细讲解,只给出常见用 ...