次のコードを使用して、propsのブール値に基づいてReactコンポーネントでclassNameを動的に設定します。
<div className={this.props.menuOpen ? 'inactive' : 'active'}> ... </div>
ただし、CSSモジュールも使用しているため、classNameを次のように設定する必要があります。
import styles from './styles.css';
<div className={styles.sideMenu}> ... </div>
私はこれに問題があります-複数のクラスでより多くの制御を得るために classnames を使用しようとしましたが、最終結果はclassNameがstyles.sideMenu
[〜#〜] and [〜#〜]styles.active
(CSSモジュールが機能するため)これを処理する方法がわかりません。
ガイダンスは大歓迎です。
classnames およびes6を使用:
let classNames = classnames(styles.sideMenu, { [styles.active]: this.props.menuOpen });
classnames
とes5を使用:
var classNames = classnames(styles.sideMenu, this.props.menuOpen ? styles.active : '');
三項演算子の代わりに論理AND
を使用すると、classnames
が偽の値を省略するため、さらに冗長になります。
<div className={ classNames(styles.sideMenu, this.props.menuOpen && styles.active) }></div>
ここでパーティーに少し遅れましたが、文字列テンプレートを使用するとうまくいきます-必要に応じて、三項演算子をconstに移動することもできます:
<div className={`${styles.sideMenu} ${this.props.menuOpen ? styles.inactive : styles.active}`>
...
</div>
私はCSSモジュールの専門家ではありませんが、次のドキュメントを見つけました: https://github.com/css-modules/css-modules/blob/master/docs/import-multiple-css-modules .md
Object.assign
を使用して、active
とsideMenu
のスタイルを結合する必要があるようです。
bind
npmのclassnames
apiを使用するより良い方法を追加したかっただけです。以下のように、CSSからインポートされたスタイルオブジェクトにクラス名をバインドできます。
import classNames from 'classnames/bind';
import styles from './index.css';
let cx = classNames.bind(styles);
次のように使用します:
cx("sideMenu", "active": isOpen)
sideMenuとactiveはスタイルオブジェクトにあります。
これは私が実用的な解決策に最も近いものです:
const isActive = this.props.menuOpen ? styles.inactive : styles.active;
<div className={isActive + ' ' + styles.sideMenu}>
これは機能します-どちらもインポートされたスタイルシートのスタイルを使用できるようにし、this.props.menuOpen
はtrue
です。
しかし、それはかなりハッキーです-誰かが何かアイデアを持っているなら、私はより良い解決策を見たいです。