react原生动态添加多个className会报错:
import style from './style.css' <div className={style.class1 style.class2}</div>
想要得到最终渲染的效果是:
<div class='class1 class2'></div>
引入classnames库,安装:
npm install classnames --save
使用:
import classnames from 'classnames' <div className=classnames({ 'class1': true, 'class2': true )> </div>
可以将后面的true省略,但这种我认为是比较直观的,可以对传入的class进行比较明显的动态判断
其他用法:
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' // 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'
也可以传入数组对象:
var arr = ['b', { c: true, d: false }]; classNames('a', arr); // => 'a b c'
可以传入动态class
let buttonType = 'primary'; classNames({ [`btn-${buttonType}`]: true });
在react中可以直接在classname内部传入动态class并进行条件判断,
不适用classnames时的书写方式:
var Button = React.createClass({ // ... 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>; } });
使用了之后可以简化:
var classNames = require('classnames'); var Button = React.createClass({ // ... 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>; } });
.