react 中想要使用多個 className 時,就會用到 classnames 這個庫
安裝 install i classnames --save
或這yarn add classnames --save
vs code styles 提示工具 可以安裝 css modules clinyong.vscode-css-modules
引用
import classnames from 'classnames';
使用
第一種方式
import Styles from './pagin-cover.less';
<Pagination
className={classnames(Styles['scf-pagination'],
{[Styles['xxxx']] : status === 1}
)}
/>
//或者
<Pagination
className={classnames(Styles.xxxxx)}
/>
第二種方式
import "./pagin-cover.less";
<Pagination
className={classnames({ "scf-pagination": true, xxxx: status === 1 })}
/>;
第三種方式
import "./pagin-cover.less";
<Pagination className={classnames("scf-pagination", "xxxxx")} />;
React-classnames 庫
react 原生動態添加多個 className 會報錯:
import style from './style.css'
<div className={style.class1 style.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>;
},
});