web-dev-qa-db-ja.com

ReactJSコンポーネントに複数のクラスを追加する方法

私はReactJSとJSXに不慣れで、以下のコードに少し問題があります。

classNameli属性に複数のクラスを追加しようとしています。

<li key={index} className={activeClass, data.class, "main-class"}></li>

私のReactコンポーネントは以下のとおりです。

var AccountMainMenu = React.createClass({
  getInitialState: function() {
    return { focused: 0 };
  },

  clicked: function(index) {
    this.setState({ focused: index });
  },

  render: function() {
    var self = this;
    var accountMenuData = [
      {
        name: "My Account",
        icon: "icon-account"
      },
      {
        name: "Messages",
        icon: "icon-message"
      },
      {
        name: "Settings",
        icon: "icon-settings"
      }
    /*{
        name:"Help &amp; Support &nbsp; <span class='font-awesome icon-support'></span>(888) 664.6261",
        listClass:"no-mobile last help-support last"
      }*/
    ];

    return (
      <div className="acc-header-wrapper clearfix">
        <ul className="acc-btns-container">
          {accountMenuData.map(function(data, index) {
            var activeClass = "";

            if (self.state.focused == index) {
              activeClass = "active";
            }

            return (
              <li
                key={index}
                className={activeClass}
                onClick={self.clicked.bind(self, index)}
              >
                <a href="#" className={data.icon}>
                  {data.name}
                </a>
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
});

ReactDOM.render(<AccountMainMenu />, document.getElementById("app-container"));
223
Hector

クラス名 を使います。例えば:

...
    var liClasses = classNames({
      'main-class': true,
      'activeClass': self.state.focused === index
    });

    return (<li className={liClasses}>{data.name}</li>);
...
147
Jack

私はES6テンプレートリテラル を使います。例えば:

const error = this.state.valid ? '' : 'error'
const classes = `form-control round-lg ${error}`

そしてそれをレンダリングするだけです:

<input className={classes} />

ワンライナーバージョン:

<input className={`form-control round-lg ${this.state.valid ? '' : 'error'}`} />
270
Damjan Pavlica

JavaScriptを使うだけです。

<li className={[activeClass, data.klass, "main-class"].join(' ')} />

クラスベースのキーと値をオブジェクトに追加したい場合は、以下を使用できます。

function classNames(classes) {
  return Object.entries(classes)
    .filter(([key, value]) => value)
    .map(([key, value]) => key)
    .join(' ');
}

const classes = {
  'maybeClass': true,
  'otherClass': true,
  'probablyNotClass': false,
};

const myClassNames = classNames(classes);
// Output: "maybeClass otherClass"

<li className={myClassNames} />

あるいはもっと簡単です。

const isEnabled = true;
const isChecked = false;

<li className={[isEnabled && 'enabled', isChecked && 'checked']
  .filter(e => !!e)
  .join(' ')
} />
// Output:
// <li className={'enabled'} />
115
0xcaff

Concat

私はCSSモジュールを使っていますが、それは簡単です。

import style from '/css/style.css';

<div className={style.style1+ ' ' + style.style2} />

これは次のようになります。

<div class="src-client-css-pages-style1-selectionItem src-client-css-pages-style2">

言い換えれば、両方のスタイル

条件付き

Ifと同じ考えを使うのは簡単でしょう

const class1 = doIHaveSomething ? style.style1 : 'backupClass';

<div className={class1 + ' ' + style.style2} />
71
Jamie Hutber

これはES6テンプレートリテラルで実現できます。

<input className={`class1 ${class2}`}>
26
Cody Moniz

このように複数のクラス名を持つ要素を作成することができます。

<li className="class1 class2 class3">foo</li>

当然、クラス名を含む文字列を使用し、この文字列を操作して要素のクラス名を更新することができます。

var myClassNammes = 'class1 class2 class3';
...
<li className={myClassNames}>foo</li>
25
nightlyop

これが、ES6で可能なことです。

className = {`
      text-right
      ${itemId === activeItemId ? 'active' : ''}
      ${anotherProperty === true ? 'class1' : 'class2'}
`}

複数のクラスと条件を一覧表示できます。また、静的クラスを含めることもできます。追加のライブラリを追加する必要はありません。

がんばろう ;)

15
Hristo Eftimov

バニラJS

外部ライブラリは必要ありません - ES6を使うだけです テンプレート文字列

<i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
11
Huw Davies

多分 classnames あなたを助けることができる。

var classNames = require('classnames');
classNames('foo', {'xx-test': true, bar: false}, {'ox-test': false}); // => 'foo xx-test'
8
xsong

追加するだけで、空の文字列を除外できます。

className={[
    'read-more-box',
    this.props.className,
    this.state.isExpanded ? 'open' : 'close',
].filter(x => !!x).join(' ')}
4

パーティーに遅刻しますが、なぜそのような単純な問題にサードパーティを使用するのでしょうか。

@Huw Daviesが述べたようにあなたはそれをすることができます - 最良の方法

1. <i className={`${styles['foo-bar-baz']} fa fa-user fa-2x`}/>
2. <i className={[styles['foo-bar-baz'], 'fa fa-user', 'fa-2x'].join(' ')}

どちらもいいです。しかし、大規模なアプリでは書き込みが複雑になることがあります。それを最適にするために、私は上記のことを同じですが、それをヘルパークラスに入れます

以下のヘルパー関数を使用すると、将来の編集のためにロジックを分離しておくことができます。また、クラスを追加する方法が複数あります。

classNames(styles['foo-bar-baz], 'fa fa-user', 'fa-2x')

または

classNames([styles['foo-bar-baz], 'fa fa-user', 'fa-2x'])

これが私の下のヘルパー関数です。私はそれをhelper.jsに入れて、私はすべての私の共通のメソッドを保持します。そのような単純な機能なので、私は制御を保つために第三者を使うことを避けました

export function classNames (classes) {
    if(classes && classes.constructor === Array) {
        return classes.join(' ')
    } else if(arguments[0] !== undefined) {
        return [...arguments].join(' ')
    }
    return ''
}
3
Elton Jain

複数のクラスを追加するためだけに外部パッケージを使用する必要はないと思います。

私は個人的に使用しています

<li className={`li active`}>Stacy</li> 
or <li className={`li ${this.state.isActive ? 'active' : ''}`}>Stacy<li>

条件に応じてクラスを追加または削除する必要がある場合の2番目の方法。

他のモジュールをインポートしたくない場合は、この関数はclassNamesモジュールのように機能します。

function classNames(rules) {
    var classes = ''

    Object.keys(rules).forEach(item => {    
        if (rules[item])
            classes += (classes.length ? ' ' : '') + item
    })

    return classes
} 

あなたはこのようにそれを使うことができます:

render() {
    var classes = classNames({
        'storeInfoDiv': true,  
        'hover': this.state.isHovered == this.props.store.store_id
    })   

    return (
        <SomeComponent style={classes} />
    )
}
2
Seth

https://www.npmjs.com/package/classnames を使用します

「classnames」からclassNamesをインポートします。

  1. カンマ区切りを使用して複数のクラスを使用できます:

    <li className={classNames(classes.tableCellLabel, classes.tableCell)}>Total</li>
    
  2. 条件で区切られたカンマを使用して複数のクラスを使用できます:

    <li className={classNames(classes.buttonArea, !nodes.length && classes.buttonAreaHidden)}>Hello World</li> 
    

ClassNamesの小道具として配列を使用しても機能しますが、警告が表示されます。

className={[classes.tableCellLabel, classes.tableCell]}
1
Vikramjit Singh

facebookのTodoTextInput.jsの例を使用して

render() {
    return (
      <input className={
        classnames({
          edit: this.props.editing,
          'new-todo': this.props.newTodo
        })}
        type="text"
        placeholder={this.props.placeholder}
        autoFocus="true"
        value={this.state.text}
        onBlur={this.handleBlur}
        onChange={this.handleChange}
        onKeyDown={this.handleSubmit} />
    )
  } 

classnames を通常のVanilla jsコードに置き換えると、次のようになります。

render() {
    return (
      <input
        className={`
          ${this.props.editing ? 'edit' : ''} ${this.props.newTodo ? 'new-todo' : ''}
        `}
        type="text"
        placeholder={this.props.placeholder}
        autoFocus="true"
        value={this.state.text}
        onBlur={this.handleBlur}
        onChange={this.handleChange}
        onKeyDown={this.handleSubmit} />
    )
  }
1
Vlad Bezden

あなたはこのように複数のクラス名を持つ要素を作成することができます。

CSSをインポートしている場合は、次のようにすることができます。方法1:

import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={[styles.class1, styles.class2].join(' ')}>
        { 'text' }
      </div>
    );
  }
}

方法2:

import React, { Component, PropTypes } from 'react';
import csjs from 'csjs';
import styles from './styles';
import insertCss from 'insert-css';
import classNames from 'classnames';
insertCss(csjs.getCss(styles));
export default class Foo extends Component {
  render() {
    return (
      <div className={styles.class1 + ' ' + styles.class2}>
        { 'text' }
      </div>
    );
  }
}

**

内部としてCSSを適用する場合:

const myStyle = {
  color: "#fff"
};

// React Element using Jsx
const myReactElement = (
  <h1 style={myStyle} className="myClassName myClassName1">
    Hello World!
  </h1>
);

ReactDOM.render(myReactElement, document.getElementById("app"));
.myClassName {
  background-color: #333;
  padding: 10px;
}
.myClassName1{
  border: 2px solid #000;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.0/umd/react-dom.production.min.js"></script>
<div id="app">
  
</div>
0
arvinda kumar

コンポーネントにインポートされたcssモジュールへのbindclassNames

import classNames from 'classnames'; 
import * as styles from './[STYLES PATH];
const cx = classNames.bind(styles); 

classnamesは、宣言的な方法でReact要素のclassNameを宣言する機能を与えます。

例:

<div classNames={cx(styles.titleText)}> Lorem </div>

<div classNames={cx('float-left')}> Lorem </div> // global css declared without css modules
<div classNames={cx( (test === 0) ?
             styles.titleText : 
             styles.subTitleText)}>  Lorem </div> // conditionally assign classes

<div classNames={cx(styles.titleText, 'float-left')}> Lorem </div> //combine multiple classes

私はReact 16.6.3と@Material UI 3.5.1を使用していて、className={[classes.tableCell, classes.capitalize]}のようにclassNameで配列を使用することができます。

だからあなたの例では、以下は似ているでしょう。

<li key={index} className={[activeClass, data.class, "main-class"]}></li>
0
Devakhim

さらにクラスを追加するには、className = {${classes.hello} ${classes.hello1}

0
Rama Krishna

それが私がすることです:

成分:

const Button = ({ className }) => (
  <div className={ className }> </div>
);

呼び出し元コンポーネント

<Button className = 'hashButton free anotherClass' />
0
RegarBoy

rc-classnames packageを使用します。

// ES6
import c from 'rc-classnames';

// CommonJS
var c = require('rc-classnames');

<button className={c('button', {
  'button--disabled': isDisabled,
  'button--no-radius': !hasRadius
})} />

クラスは任意の形式(配列、オブジェクト、引数)で追加できます。配列または引数のすべての真の値と、trueに等しいオブジェクト内のキーが結合されます。

例えば:

ReactClassNames('a', 'b', 'c') // => "a b c"
ReactClassNames({ 'a': true, 'b': false, c: 'true' }) // => "a c"
ReactClassNames(undefined, null, 'a', 0, 'b') // => "a b"
0
morajabi