[javascript] ReactJS 컴포넌트에 여러 클래스를 추가하는 방법

ReactJS와 JSX를 처음 사용하고 아래 코드에 약간의 문제가 있습니다.

className각 속성에 여러 클래스를 추가하려고합니다 li.

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

내 반응 구성 요소는 다음과 같습니다

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"));



답변

내가 사용하는 클래스 이름을 (하지)를 사용하는 클래스를 결정하는 데 필요한 논리의 공정한 금액이있는 경우. 지나치게 간단한 예 :

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

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

즉, 의존성을 포함하지 않으려면 아래에 더 나은 대답이 있습니다.


답변

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'}`} />


답변

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'} />


답변

연결

화려할 필요는 없습니다. 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} />


답변

ES6 템플릿 리터럴을 사용하면됩니다.

<input className={`class1 ${class2}`}>


답변

다음과 같이 여러 클래스 이름을 가진 요소를 만들 수 있습니다.

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

당연히 클래스 이름이 포함 된 문자열을 사용하고이 문자열을 조작하여 요소의 클래스 이름을 업데이트 할 수 있습니다.

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


답변

ES6를 사용하여이를 수행 할 수 있습니다.

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

여러 클래스와 조건을 나열 할 수 있으며 정적 클래스를 포함 할 수도 있습니다. 추가 라이브러리를 추가 할 필요는 없습니다.

행운을 빕니다 😉