ReactJSは手動クラス名に動的クラスを追加します


158

通常のクラスのリストに動的クラスを追加する必要がありますが、次のような方法(私はbabelを使用しています)がわかりません。

<div className="wrapper searchDiv {this.state.something}">
...
</div>

何か案は?


回答:


240

これを行うことができます、通常のJavaScript:

className={'wrapper searchDiv ' + this.state.something}

またはバッククォート付きの文字列テンプレートバージョン:

className={`wrapper searchDiv ${this.state.something}`}

もちろんどちらのタイプも単なるJavaScriptですが、最初のパターンは従来のタイプです。

とにかく、JSXでは、中かっこで囲まれたものはすべてJavaScriptとして実行されるので、基本的にはそこで好きなことを実行できます。ただし、JSX文字列中かっこを組み合わせることは、属性の必須条件です。


そして、複数のクラスの場合はどうなりますか?
Pardeep Jain 2017

5
複数の動的クラスの場合、すべての動的クラスはその状態からのものである必要があります。つまり、を使用することはできませんelement.classList.add("my-class")。したがってを可能に:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
ケビンFarrugia

className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' 'これは機能しません。なぜ誰かが言うことができますか?
kryptokinght 2018

54

プロジェクトの成長に応じて追加する必要がある動的クラスの数によっては、GitHubのJedWatsonによるclassnamesユーティリティをチェックする価値があるでしょう。条件付きクラスをオブジェクトとして表すことができ、trueと評価されるものを返します。

したがって、Reactのドキュメントの例として:

render () {

var btnClass = classNames({
  'btn': true,
  'btn-pressed': this.state.isPressed,
  'btn-over': !this.state.isPressed && this.state.isHovered
});

return <button className={btnClass}>I'm a button!</button>;

} 

状態が変化するとReactが再レンダリングをトリガーするため、動的クラス名は自然に処理され、コンポーネントの状態で最新に保たれます。


5
そのような単純なことのためにclassNamesを使用することは過剰です。それを使用することを避け、dannyjolieの単純な答えを選択してください
チェックリスト

2
それは簡単なことですか?ほとんどの場合、要素に適用するクラスを細かく完全に制御する必要があります。
Dragas

5
@checklistそうでないと私は主張しますが、classnamesパッケージはGzippingの前に1.1kB(およびGzipping後に半分のkB)であり、依存関係がなく、クラス名操作のためのはるかにクリーンなAPIを提供します。APIの方がはるかに表現力がある場合、それほど小さいものを時期尚早に最適化する必要はありません。標準の文字列操作を使用する場合は、すべての条件付きクラス名の前、またはすべての標準クラス名の後のいずれかで、スペースを考慮することを忘れないでください。
tomhughes

classNamesはすばらしいです。コンポーネントが複雑になるにつれて、小道具の読み取り、追加、修正が手動操作よりも簡単であることがわかりました。
MiFiHiBye 2018


25

これが動的classNameの最適なオプションです。JavaScriptで行うように、いくつかの連結を行ってください。

     className={
        "badge " +
        (this.state.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }

これは、リンティングの問題のない最良のソリューションです。魅力のように働いた。ありがとうございました。
Royal.O

3

状態に応じて表示されるスタイル名が必要な場合は、次の構文を使用することをお勧めします。

<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>

2

フックを使用してこれを試してください:

        const [dynamicClasses, setDynamicClasses] = React.useState([
    "dynamicClass1", "dynamicClass2
]);

これをclassName属性に追加します。

<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>

クラスを追加するには:

    const addClass = newClass => {
       setDynamicClasses([...dynamicClasses, newClass])
    }

クラスを削除するには:

        const deleteClass= classToDelete => {

           setDynamicClasses(dynamicClasses.filter(class = > {
             class !== classToDelete
           }));

        }

1

この npmパッケージを使用できます。すべてを処理し、変数または関数に基づく静的クラスと動的クラスのオプションがあります。

// Support for string arguments
getClassNames('class1', 'class2');

// support for Object
getClassNames({class1: true, class2 : false});

// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

<div className={getClassNames({class1: true, class2 : false})} />

1
getBadgeClasses() {
    let classes = "badge m-2 ";
    classes += (this.state.count === 0) ? "badge-warning" : "badge-primary";
    return classes;
}

<span className={this.getBadgeClasses()}>Total Count</span>

-1
className={css(styles.mainDiv, 'subContainer')}

このソリューションは、React SPFxで試行およびテストされています。

また、インポートステートメントを追加します:

import { css } from 'office-ui-fabric-react/lib/Utilities';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.