조건부로 React 컴포넌트에 속성을 추가하려면 어떻게해야합니까?


550

특정 조건이 충족되는 경우에만 React 구성 요소에 속성을 추가하는 방법이 있습니까?

렌더링 후 Ajax 호출을 기반으로 요소를 형성하기 위해 필수 및 readOnly 속성을 추가해야하지만 readOnly = "false"가 속성을 완전히 생략하는 것과 같지 않기 때문에이를 해결하는 방법을 볼 수 없습니다.

아래 예제는 내가 원하는 것을 설명해야하지만 작동하지 않습니다 (구문 오류 : 예기치 않은 식별자).

var React = require('React');

var MyOwnInput = React.createClass({
    render: function () {
        return (
            <div>
                <input type="text" onChange={this.changeValue} value={this.getValue()} name={this.props.name}/>
            </div>
        );
    }
});

module.exports = React.createClass({
    getInitialState: function () {
        return {
            isRequired: false
        }
    },
    componentDidMount: function () {
        this.setState({
            isRequired: true
        });
    },
    render: function () {
        var isRequired = this.state.isRequired;

        return (
            <MyOwnInput name="test" {isRequired ? "required" : ""} />
        );
    }
});

1
한 의견이 누군가를 도울 수 있습니다 .React 16.7 이 저장소 (fe redux)에서만 변경하고 구성 요소에 묶은 경우 React 16.7이 다시 렌더링하지 않고 구성 요소의 html 속성을 업데이트한다는 것을 알았습니다 . 이것은 컴포넌트에 fe가 aria-modal=true있고 변경 사항을 aria / data 속성 저장소로 푸시 하지만 결과 ReactJs가 aria / 해당 구성 요소의 데이터 속성. 나는 그것을 깨닫기 위해 하루 종일 엉망이었습니다.
AlexNikonov

답변:


535

분명히 특정 속성의 경우 React는 전달하는 값이 사실이 아닌 경우 속성을 생략 할 정도로 지능적입니다. 예를 들면 다음과 같습니다.

var InputComponent = React.createClass({
    render: function() {
        var required = true;
        var disabled = false;

        return (
            <input type="text" disabled={disabled} required={required} />
        );
    }
});

결과 :

<input type="text" required>

업데이트 : 누군가가 어떻게 / 왜 이런 일이 발생하는지 궁금하다면 ReactDOM의 소스 코드, 특히 DOMProperty.js 파일 의 30167 행에서 세부 정보를 찾을 수 있습니다 .


45
일반적으로 null"지정하지 않은 것처럼 행동"을 의미합니다. 부울 돔 속성의 경우 속성 이름 / 거짓을 반복하는 것보다 true / false가 선호 <input disabled>됩니다 ( 예 : 컴파일 :React.createElement('input', {disabled: true})
Brigand

동의한다. 나는 과거에 특정 브라우저에서 문제가 있었고 습관이 너무 많이 붙어서 수동으로 ="required"파트를 추가했기 때문에 이름을 반복합니다 . 크롬은 실제로 값없이 속성 만 렌더링했습니다.
juandemarco

8
readonlyReact가 속성 readOnly(대문자 O)을 기대하기 때문에 추가되지 않습니다 .
Max

8
감사! 값이 빈 문자열이거나 0이 아닌지 확인하십시오.이 값은 제거되지 않을 수 있습니다. 예를 들어 다음과 같은 값을 전달할 수 있으며 false로 평가되면 값을 제거해야합니다 alt={props.alt || null}.
Jake

5
감사합니다, @Jake. 나는에 대한 속성을 설정 시도했다 false,하지만 null확실 속성이 실제로 제거했다.
Nathan Arthur

386

juandemarco의 답변 은 일반적으로 정확하지만 여기에 다른 옵션이 있습니다.

원하는 방식으로 객체를 만듭니다.

var inputProps = {
  value: 'foo',
  onChange: this.handleChange
};

if (condition)
  inputProps.disabled = true;

스프레드를 사용하여 렌더링하고 선택적으로 다른 소품도 전달합니다.

<input
    value="this is overridden by inputProps"
    {...inputProps}
    onChange={overridesInputProps}
 />

14
이것은 특히 많은 속성을 조건부로 추가 할 때 실제로 매우 유용합니다 (개인적 으로이 방법으로 수행 할 수 있다는 것을 몰랐습니다).
juandemarco

1
매우 우아하지만 inputProps.disabled = true가 아니어야합니까?
Joppe

매우 간단합니다. 여러 조건이 없어도 코드를 더 읽기 쉽게 만들었습니다.
Naveen Kumar PG

이 함수는 것을 볼 수 있습니다로 이것의 정확한 의미에 대한 사람의 염려 "설탕,"당신은 당신의 .jsx이 transpiled되는 스크립트를 볼 수있는 경우 _extends(정상적인 상황에서)이 소요되는, 거기에 추가되었습니다 props로 구성 "일반 속성"을 적용하십시오 Object.assign(props, inputProps).
Nathan Chappell

299

여기서 사용한 예이다 부트 스트랩Button비아 반작용 부트 스트랩 (버전 0.32.4)는 :

var condition = true;

return (
  <Button {...(condition ? {bsStyle: 'success'} : {})} />
);

상태에 따라, 하나 {bsStyle: 'success'}또는 {}반환됩니다. 스프레드 연산자는 반환 된 객체의 속성을 Button구성 요소에 스프레드합니다 . 잘못된 경우 반환 된 객체에 속성이 없으므로 구성 요소에 아무것도 전달되지 않습니다.


Andy Polhill의 의견을 기반으로 한 다른 방법 :

var condition = true;

return (
  <Button bsStyle={condition ? 'success' : undefined} />
);

유일한 작은 차이점은 두 번째 예에서 내부 구성 요소 <Button/>props객체 bsStyle에 값이 키가 있다는 것 입니다 undefined.


5
@Punit, 스프레드 연산자는 조건 연산자보다 우선 순위가 낮으므로 조건이 먼저 평가 된 다음 ( {bsStyle: 'success'}또는 그 {}결과) 해당 개체가 확산됩니다.
Victor Zamanian

5
다음과 <Button bsStyle={ condition ? 'success': undefined } /> 같이 구문이 약간 더 쉽다 undefined는 것을 알면 전달 하면 속성이 생략됩니다.
Andy Polhill

3
@AndyPolhill은 나에게 좋아 보이고 코드를 훨씬 쉽게 읽을 수 있지만 작은 차이는 코드 예제에서 내부 구성 요소 <Button/>props객체에 키 bsStyle값이 있다는 것입니다 undefined.
Arman Yeghiazaryan

@AndyPolhill 구문을 읽기 어려운 것처럼 보이는 이유는 암시적인 괄호가 없어서 예제를 이해하기 어렵게 만드는 것입니다. 괄호를 추가하기 위해 예제 편집
Govind Rai

1
첫 번째 방법은, 나를 위해 완벽하게 작동 감사합니다
Liran H를

86

대안이 있습니다.

var condition = true;

var props = {
  value: 'foo',
  ...( condition && { disabled: true } )
};

var component = <div { ...props } />;

또는 인라인 버전

var condition = true;

var component = (
  <div
    value="foo"
    { ...( condition && { disabled: true } ) } />
);

9
나는이 접근 방식이 마음에 들어서 직장 동료들 사이에서 시원해진다. 키딩을 제외하고 소품은 결국 키-값 쌍으로 전달됩니다. 맞습니까?
JohnnyQ

1
condition거짓 이면 거짓에 대해 확장 / 반복하려고 시도하지만 올바른 것으로 생각하지 않습니다.
Lars Nyström

1
@ LarsNyström, 그건 말이 되네요. 스프레드 연산자는 반복 가능 항목 만 허용합니다 false. 바벨에게 확인하십시오. 이것은 conditionBabel이 연산자를 구현하는 방식이므로 false로 평가되면 작동합니다. 사소한 해결 방법은 가능하지만 ...( condition ? { disabled: true } : {} )조금 장황합니다. 이 멋진 입력에 감사드립니다!
시즌

+1이 접근 방식은 JSX에서 특수한 경우이므로 조건부 출력 data-*또는 aria-*속성 을 원할 경우 필요 하므로 속성을 생략하지 않고 data-my-conditional-attr={ false }출력 data-my-conditional-attr="false"합니다. facebook.github.io/react/docs/dom-elements.html
ptim

32

내가하는 방법이 있습니다.

조건부로 :

<Label
    {...{
      text: label,
      type,
      ...(tooltip && { tooltip }),
      isRequired: required
    }}
/>

나는 조건을 갖지 않는 경우에 더 읽기 쉬운 (내 의견으로는) 소품을 전달하는 규칙적인 방법을 사용하는 것을 선호합니다.

조건부없이 :

<Label text={label} type={type} tooltip={tooltip} isRequired={required} />

이 부분이 어떻게 작동하는지 설명해 주 ...(tooltip && { tooltip }),시겠습니까? 이 구성 요소에 대한 작업을 수행하지만 코드에서 사용하기에 이런 식으로 뭔가를하려고 할 때 나는 확산 비 반복 가능한 값으로 시도한다는 것을 의미 오류 얻을
skwisgaar

아마도 falseyValue && {}false를 반환 하기 때문에 아마도 당신은 false에 퍼지고 있습니다 ...(false). 전체 표현을 사용하는 것이 훨씬 더 좋으므로 스프레드가 계속 작동합니다. ...(condition ? {foo: 'bar'} : {})
lfender6445

19

구성 요소 ( {isVisible && <SomeComponent />}) 를 추가 / 제거하는 데 사용되는 것과 동일한 바로 가기를 사용할 수 있습니다 .

class MyComponent extends React.Component {
  render() {
    return (
      <div someAttribute={someCondition && someValue} />
    );
  }
}

3
경우 someCondition사실이다하지만 someValuefalsy (예 : false자체, 또는 0, 속성이 여전히 포함됩니까 등)? 0좌표 속성 등을 위해 잘못된 값을 명시 적으로 포함해야하는 경우에 중요합니다 .
Andrew Willems

일반적으로 속성은 생략되었지만 data-*및 의 경우에는 aria-*위의 주석을 참조 하지 마십시오 . 값을 인용하거나 문자열로 캐스트하면 속성이 표시됩니다. 예 : someAttr={ `${falsyValue}` }rendersomeAttr="false"
ptim

19

조건이 true 인 경우 aria- * 또는 data- *를 사용하여 사용자 지정 속성을 추가하려고한다고 가정 해 보겠습니다.

{...this.props.isTrue && {'aria-name' : 'something here'}}

조건이 true 인 경우 스타일 속성을 추가하려고한다고 가정 해 보겠습니다.

{...this.props.isTrue && {style : {color: 'red'}}}

10

ECMAScript 6을 사용하는 경우 간단히 다음과 같이 작성할 수 있습니다.

// First, create a wrap object.
const wrap = {
    [variableName]: true
}
// Then, use it
<SomeComponent {...{wrap}} />

7

이것은 Ajax 호출 후 상태가 변경되고 상위 구성 요소가 다시 렌더링되므로 작동합니다.

render : function () {
    var item;
    if (this.state.isRequired) {
        item = <MyOwnInput attribute={'whatever'} />
    } else {
        item = <MyOwnInput />
    }
    return (
        <div>
            {item}
        </div>
    );
}

3

React에서 구성 요소뿐만 아니라 props, className, id 등과 같은 속성도 조건부로 렌더링 할 수 있습니다.

React에서는 구성 요소를 조건부로 렌더링하는 데 도움이되는 삼항 연산자 를 사용하는 것이 좋습니다 .

예제는 또한 구성 요소 및 해당 스타일 속성을 조건부로 렌더링하는 방법을 보여줍니다.

다음은 간단한 예입니다.

class App extends React.Component {
  state = {
    isTrue: true
  };

  render() {
    return (
      <div>
        {this.state.isTrue ? (
          <button style={{ color: this.state.isTrue ? "red" : "blue" }}>
            I am rendered if TRUE
          </button>
        ) : (
          <button>I am rendered if FALSE</button>
        )}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>


이것은 많은 속성으로 인해 정말로 혼란 스러울 수 있습니다. 스프레드 변형이 더 좋습니다.
Remi Sture

예 당신의 말이 맞지만 이것은 개요를 필요로하는 누군가를위한 것입니다. 나는 또 다른 예를 만들 것입니다. 그러나 일을 단순하게 유지하고 싶습니다.
Juraj

0

포스트 JSX In Depth를 고려하면 다음과 같이 문제를 해결할 수 있습니다.

if (isRequired) {
  return (
    <MyOwnInput name="test" required='required' />
  );
}
return (
    <MyOwnInput name="test" />
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.