每日质量NPM包-classnames
一、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-pro
CSS 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的更多相关文章
- 每日质量NPM包复制_copy-to-clipboard
一.copy-to-clipboard 官方定义: Simple module exposing copy function 理解: 一个超级简单的复制功能,并且这种方法适用于通过别的事件触发复制功能 ...
- 每日质量NPM包事件绑定_bindme(详解React的this)
一.bindme 官方定义: is a helper to bind a list of methods to an object reference 理解: 因为不推荐在render()里构建函数, ...
- 每日质量NPM包模态框_react-modal
一.react-modal 官方定义: Accessible modal dialog component for React.JS 理解: 一个容易使用的React模态框组件 二.用法 有时候我们不 ...
- 每日质量NPM包拖拽文件上传_react-dropzone
一.react-dropzone 官方定义: Simple HTML5-compliant drag'n'drop zone for files built with React.js. 理解: 一个 ...
- 如何自己写一个公用的NPM包
以markdown-clear,创建过程为例,讲解整个NPM包创建和发布流程 1 如何创建一个包 1.1 创建并使用一个工程 在GitHub上新建一个仓库,其名markdown-clear clone ...
- 【vue系列之三】从一个vue-pdf-shower,说说vue组件和npm包
前言 从去年年初开始,自己便下决心要写一个vue系列的博客,但时至今日,才写系列的第三篇博客,想来甚是惭愧. 但是慢归慢,每一篇都要保证质量,以及要写出自己的心路历程,防止自己工作中填的坑再让读者走一 ...
- 从0到1发布一个npm包
从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...
- Github 持续化集成 工作流 Npm包自动化发布
Github 持续化集成 工作流 Npm包自动化发布 简介 持续集成指的是,频繁地(一天多次)将代码集成到主干. 它的好处主要有两个: 快速发现错误.每完成一点更新,就集成到主干,可以快速发现错误 ...
- npm包与gem包--在线&离线安装
目录 NPM 在线 离线 GEM 在线 离线 NPM NPM,即为Node的包管理工具,官网为 https://www.npmjs.com/,我们可以在站内搜索所需要的NPM包,了解相关的使用规则 安 ...
随机推荐
- Shell 比较两个数的大小
格式很重要多一个空格少一个空格都可能出错 li@ubuntu:~/test$ cat compare.sh #!/bin/bash read x read y if [ $x -lt $y ] the ...
- tcpdump 命令
tcpdump命令高级网络 tcpdump命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析. 选项 -a:尝试将网络和广播 ...
- [转载]Oracle ltrim() 函数用法
前面有说到过LPAD和RPAD这两个函数用法的文章,今天发现与之相反意义的另外两个函数,那就是LTRIM() RTRIM(). 这次就挑LTRIM() 这一函数来讲讲: 具体的语法格式如下: LTRI ...
- [转载]FlipClock.js时钟,计数,3D翻转插件
1.FlipClock.js能够自动定义计数,时钟的翻牌效果,调用简单,下面简单记录下用法 2.官网地址:http://www.flipclockjs.com/ 3.调用2个文件 <link h ...
- C调用java JNI_CreateJavaVM只能调用成功一次
https://bbs.csdn.net/topics/392264971 再使用c语言调用java代码的时候,选择使用JNI,根据网上的提示已经能够正常跑了,int mask_name( char* ...
- Java基础再复习(继承、多态、方法内部类**、HashMap用法**、参数传递**)
###继承: package com.shiyan; public class Animal { public int legNum; //动物四肢的数量 //类方法 public void bark ...
- mycat下mysql jdbc connector使用高版本报PacketTooBigException异常
如下所示: 5.1.30切换为mysql-connector 5.1.46/40,报错,可参考https://blog.csdn.net/n447194252/article/details/7530 ...
- ZVAL——PHP源码分析
基于 PHP 5.6.20 ZVAL——php变量实现的基础 _zval_struct 结构体的定义位于 Zend/zend.h 322 行 typedef union _zvalue_value { ...
- linux 实时显示网速bash
执行方法先授权再运行 chmod +x shi.sh脚本+网卡名称 ./shi.sh ens33 #!/bin/bash while [ "1" ] do eth=$1 RXpre ...
- git将本地内容传送到远程仓库出现![rejected] master -> master (fetch first)错误
问题:使用git push -u 远程库名 master 命令将本地提交的内容传到git远程库时出现错误: 命令: git push -u origin master 出现错误: To https:/ ...