最近在寫(xiě)React的項(xiàng)目中弦追,看到之前的大佬引入的classnames組件庫(kù)驴娃,特別的實(shí)用,在此跟大家分享一下岩瘦。
從名字上可以看出未巫,這個(gè)庫(kù)是和類(lèi)名有關(guān)的。官方的介紹就是一個(gè)簡(jiǎn)單的支持動(dòng)態(tài)多類(lèi)名的工具庫(kù)启昧。
classnames的引入
使用 npm安裝
npm install classnames
使用 Bower安裝
bower install classnames
使用 Yarn安裝
yarn add classnames
引入
import classnames from ‘classnames’;
使用 Node.js, Browserify, or webpack:
var classNames = require('classnames');
classNames('foo', 'bar'); // => 'foo bar'
classnames函數(shù)的使用
classNames 函數(shù)接受任意數(shù)量的參數(shù)叙凡,可以是string、boolean密末、number握爷、array、dictionary等严里。
參數(shù) 'foo' 是 { foo: true } 的縮寫(xiě)饼拍。如果與給定鍵關(guān)聯(lián)的值是false的,則該key值將不會(huì)包含在輸出中田炭。
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'
// lots of arguments of various types
classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
// other falsy values are just ignored
classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
數(shù)組的形式
數(shù)組可以按照上面的規(guī)則,遞歸展開(kāi)數(shù)組中的每一項(xiàng):
var arr = ['b', { c: true, d: false }];`
classNames('a', arr); // => 'a b c'
ES6中使用動(dòng)態(tài)類(lèi)名
let buttonType = 'primary';`
classNames({ [`btn-${buttonType}`]: true });
結(jié)合React一起使用
這個(gè)包是classSet的官方替代品漓柑,她最初是在React.js插件包中提供的教硫。
常見(jiàn)的一個(gè)應(yīng)用場(chǎng)景是根據(jù)條件動(dòng)態(tài)設(shè)置類(lèi)名,在React中是會(huì)寫(xiě)出如下的代碼:
class Button extends React.Component {
// ...
render () {
var btnClass = 'btn';
if (this.state.isPressed) btnClass += ' btn-pressed';
else if (this.state.isHovered) btnClass += ' btn-over';
return <button className={btnClass}>{this.props.label}</button>;
}
}
使用classnames可以通過(guò)對(duì)象非常方便的寫(xiě)出條件多類(lèi)名辆布。
var classNames = require('classnames');
class Button extends React.Component {
// ...
render () {
var btnClass = classNames({
btn: true,
'btn-pressed': this.state.isPressed,
'btn-over': !this.state.isPressed && this.state.isHovered
});
return <button className={btnClass}>{this.props.label}</button>;
}
}
因?yàn)榭梢詫?duì)象瞬矩、數(shù)組和字符串參數(shù)混合在一起,所以支持可選的 className props 也更簡(jiǎn)單锋玲,因?yàn)橹挥姓鎸?shí)的參數(shù)才會(huì)包含在結(jié)果中:
var btnClass = classNames('btn', this.props.className, {
'btn-pressed': this.state.isPressed,
'btn-over': !this.state.isPressed && this.state.isHovered
});
總結(jié):
在React項(xiàng)目中使用classnames是非常方便我們管理動(dòng)態(tài)多類(lèi)名景用。為我們的工作真正的提效。