조건부로 클래스 속성을 적용하는 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>

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


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.