조건부로 클래스 속성을 적용하는 J에 반응


334

다음과 같은 부모 구성 요소에서 전달 된 내용에 따라이 버튼 그룹을 조건부로 표시하고 숨기고 싶습니다.

<TopicNav showBulkActions={this.__hasMultipleSelected} />

....

__hasMultipleSelected: function() {
  return false; //return true or false depending on data
}

....

var TopicNav = React.createClass({
render: function() {
return (
    <div className="row">
        <div className="col-lg-6">
            <div className="btn-group pull-right {this.props.showBulkActions ? 'show' : 'hidden'}">
                <button type="button" className="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
                  Bulk Actions <span className="caret"></span>
                </button>
                <ul className="dropdown-menu" role="menu">
                  <li><a href="#">Merge into New Session</a></li>
                  <li><a href="#">Add to Existing Session</a></li>
                  <li className="divider"></li>
                  <li><a href="#">Delete</a></li>
                </ul>
            </div>
        </div>
    </div>
    );
  }
});

그러나 {this.props.showBulkActions? 'show': 'hidden'}. 내가 여기서 잘못하고 있습니까?


react-bootstrap 을 고려할 수도 있습니다. 이는 클래스 클래스의 일부를 구성 요소 속성으로 추상화하여 조금 더 쉽게하려는 일을하기 때문입니다.
Dancrumb 2016 년

답변:


589

중괄호는 문자열 안에 있으므로 문자열로 평가됩니다. 외부에 있어야하므로 작동해야합니다.

<div className={"btn-group pull-right " + (this.props.showBulkActions ? 'show' : 'hidden')}>

"pull-right"다음에 공백이 있습니다. 실수로 "pull-right show"대신 "pull-rightshow"클래스를 제공하고 싶지 않습니다. 또한 괄호가 있어야합니다.


3
감사! 어떤 이유로 든 btn-group pull-right를 전혀 출력하지 않았기 때문에 약간 수정해야했습니다. 보여 주거나 숨기십시오.
apexdodge

이것은 특히 classnames적절하지 않은 특정 경우에 도움 이됩니다. 당신이 당신에있는 경우 render기능과 당신이가 map, 당신은이 대답은 그것에 대해 매우 유용합니다, 그래서 당신은, 당신이 그것을 렌더링하는 시간에 클래스를 추가할지 여부를 알 수 있습니다.
Dave Cooper

렌더링 또는 리턴에 여러 조건부 템플릿을 사용하는 대신 훌륭한 대안
devonj

@apexdodge 어떤 수정을해야했는지. 나는 같은 문제가 있습니다.
RamY

1
@RamY 한 가지 방법은 모든 클래스를 조건부 안에 넣는 것 this.props.showBulkActions ? 'btn-group pull-right show' : 'btn-group pull-right hidden')입니다. 우아하지는 않지만 작동합니다.
Ian

87

다른 사람들이 언급했듯이 classnames 유틸리티는 ReactJ에서 조건부 CSS 클래스 이름을 처리하기 위해 현재 권장되는 방법입니다.

귀하의 경우 솔루션은 다음과 같습니다.

var btnGroupClasses = classNames(
  'btn-group',
  'pull-right',
  {
    'show': this.props.showBulkActions,
    'hidden': !this.props.showBulkActions
  }
);

...

<div className={btnGroupClasses}>...</div>

참고로, 클래스 showhidden클래스 를 모두 사용하지 않도록 코드를 더 간단하게 만들 것을 제안합니다 . 기본적으로 무언가를 표시하기 위해 클래스를 설정할 필요는 없습니다.


11
"현재 권장되는 접근 방식"인 classNames 유틸리티에 대해 자세히 설명해 주시겠습니까? 잘 알려진 모범 사례 문서에서 캡처 한 것입니까? 아니면 React와 classNames현재 의 입소문이 있습니까?
Alexander Nied

6
@anied 글을 작성할 당시 공식 React 문서에서 권장되었습니다 : web.archive.org/web/20160602124910/http://facebook.github.io:80/…
Diego V

3
최신 문서에 여전히 언급되어 있습니다 . " 이와 같은 코드를 작성하는 경우가 종종 있으면 클래스 이름 패키지로 단순화 할 수 있습니다. "
Franklin Yu

66

트랜스 파일러 (예 : Babel 또는 Traceur)를 사용하는 경우 새로운 ES6 " 템플릿 문자열 "을 사용할 수 있습니다 .

다음은 @ spitfire109의 답변입니다.

<div className={`btn-group pull-right ${this.props.showBulkActions ? 'shown' : 'hidden'}`}>

이 방법을 사용하면 하나 렌더링, 그런 깔끔한 일을 할 수 있습니다 s-is-shown또는 s-is-hidden:

<div className={`s-${this.props.showBulkActions ? 'is-shown' : 'is-hidden'}`}>

20
두 번째 접근 방식, 특히 큰 코드베이스에서 클래스 문자열을 잘리지 않도록주의하십시오. 예를 들어 누군가 가 코드베이스를 검색 s-is-shown하거나 s-is-hidden코드베이스에서 검색하면 이 코드를 찾지 못합니다.
Mark

15

여기에서 문자열 리터럴을 사용할 수 있습니다

const Angle = ({show}) => {

   const angle = `fa ${show ? 'fa-angle-down' : 'fa-angle-right'}`;

   return <i className={angle} />
}

9

@ spitfire109의 훌륭한 대답을 따르면 다음과 같이 할 수 있습니다.

rootClassNames() {
  let names = ['my-default-class'];
  if (this.props.disabled) names.push('text-muted', 'other-class');

  return names.join(' ');
}

그런 다음 render 함수 내에서 :

<div className={this.rootClassNames()}></div>

jsx를 짧게 유지



8

옵션 클래스 이름이 하나만 필요한 경우 :

<div className={"btn-group pull-right " + (this.props.showBulkActions ? "show" : "")}>

1
false조건이 실패하면 클래스 가 추가 됩니다.
RA.


5

2019 년

반응은 많은 유틸리티의 호수입니다. 하지만 npm패키지는 필요하지 않습니다 . 함수를 어딘가에 만들고 classnames필요할 때 호출하십시오.

function classnames(obj){
  return Object.entries(obj).filter( e => e[1] ).map( e=>e[0] ).join(' ');
}

또는

function classnames(obj){
 return Object.entries(obj).map( ([k,v]) => v?k:'' ).join(' ');
}

  stateClass= {
    foo:true,
    bar:false,
    pony:2
  }
  classnames(stateClass) // return 'foo pony'

 <div className="foo bar {classnames(stateClass)}"> some content </div>

영감을 위해

선언 헬퍼 소자 및 그것을 사용하는 toggle방법을

(DOMToken​List)classList.toggle(class,condition)

예:

const classes = document.createElement('span').classList; 

function classstate(obj){
  for( let n in obj) classes.toggle(n,obj[n]);
 return classes; 
}

4

유지 보수 및 가독성에 더 적합한보다 우아한 솔루션 :

const classNames = ['js-btn-connect'];

if (isSelected) { classNames.push('is-selected'); }

<Element className={classNames.join(' ')}/>

3

이것을 사용할 수 있습니다 :

<div className={"btn-group pull-right" + (this.props.showBulkActions ? ' show' : ' hidden')}>

2

이것은 당신을 위해 일할 것입니다

var TopicNav = React.createClass({
render: function() {

let _myClasses = `btn-group pull-right {this.props.showBulkActions?'show':'hidden'}`;

return (
            ...
            <div className={_myClasses}>
               ...
            </div>
    );
  }
});

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', null, undefined, 3, ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

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

1

값에 this.props.showBulkActions따라 다음과 같이 클래스를 동적으로 전환 할 수 있습니다.

<div ...{...this.props.showBulkActions 
? { className: 'btn-group pull-right show' } 
: { className: 'btn-group pull-right hidden' }}>

1

클래스의 일부로 가변 컨텐츠 를 사용할 수도 있다고 덧붙이고 싶습니다.

<img src={src} alt="Avatar" className={"img-" + messages[key].sender} />

컨텍스트는 봇과 사용자 간의 대화이며 발신자에 따라 스타일이 변경되며 이는 브라우저 결과입니다.

<img src="http://imageurl" alt="Avatar" class="img-bot">

1

추가 할 클래스가 둘 이상있을 때 유용합니다. 공백으로 배열의 모든 클래스를 결합 할 수 있습니다.

const visibility = this.props.showBulkActions ? "show" : ""
<div className={["btn-group pull-right", visibility].join(' ')}>

1

바꾸다:

<div className="btn-group pull-right {this.props.showBulkActions ? 'show' : 'hidden'}">`

와:

<div className={`btn-group pull-right ${this.props.showBulkActions ? 'show' : 'hidden'}`}


0

나는 이것을 삼항 및 클래스 이름 라이브러리로 수행하는 방법을 설명합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.