ReactJS의 동적 속성


92

버튼 요소에 비활성화 된 속성을 동적으로 포함 / 생략하고 싶습니다. 동적 속성 값의 예를 많이 보았지만 속성 자체는 보지 못했습니다. 다음과 같은 렌더링 기능이 있습니다.

render: function() {
    var maybeDisabled = AppStore.cartIsEmpty() ? "disabled" : "";
    return <button {maybeDisabled}>Clear cart</button>
}

"{"문자로 인해 구문 분석 오류가 발생합니다. AppStore.cartIsEmpty ()의 (boolean) 결과에 따라 disabled 속성을 어떻게 포함 / 생략 할 수 있습니까?

답변:


168

선택적 속성 ( disabled및 사용할 수있는 기타 포함)을 추가하는 가장 깨끗한 방법 은 현재 JSX 스프레드 속성 을 사용하는 것입니다 .

var Hello = React.createClass({
    render: function() {
        var opts = {};
        if (this.props.disabled) {
            opts['disabled'] = 'disabled';
        }
        return <button {...opts}>Hello {this.props.name}</button>;
    }
});

React.render((<div><Hello name="Disabled" disabled='true' />
    <Hello name="Enabled"  />
</div>)
, document.getElementById('container'));

스프레드 속성을 사용하면 자바 스크립트 개체 인스턴스를 사용하여 원하는 속성을 동적으로 추가 (또는 재정의) 할 수 있습니다. 위의 예에서 코드 는 속성이 구성 요소 인스턴스에 전달 될 때 disabled키 ( disabled이 경우 값 포함)를 만듭니다 .disabledHello

만 사용하려면 disabled하지만 대답은 잘 작동합니다.


일단 배치되면 CSS는 다음과 같이 a[disabled] { pointer-events: none; }요소 / 구성 요소에 대한 작업을 중지합니다
timbo

49

disabled속성에 부울을 전달할 수 있습니다 .

render: function() {
    return <button disabled={AppStore.cartIsEmpty()}>Clear cart</button>
}

8
아니 당신은 할 수 없습니다. disabled 속성이 있으면 버튼이 완전히 비활성화됩니다. http://jsfiddle.net/ttjhyvmt/
Timmy

20
반응은 조건부 설정에 영리 충분 disabled이 전달 된 값에 따라 결과 HTML에 속성 jsfiddle.net/kb3gN/10379
알렉상드르 Kirszenberg

2
내가 어떻게 놓쳤는 지 모르겠습니다. 감사합니다! 내 특정 사건이 작동하는 동안, 나는 생략합니다은 / 속성을 포함하는 다른 답변을 수락 한
티미

1
그러나 IE11에 문제가 있었지만 최신 반응을 사용하지 않았습니다. JSX 스프레드 속성 답변이 작동했습니다.
LessQuesar

24

나는 React 16을 사용하고 있으며 이것은 나를 위해 작동합니다 ( bool테스트는 어디에 있습니까 ).

<fieldset {...(bool ? {disabled:true} : {})}>

기본적으로 테스트 ( bool)를 기반으로 속성이있는 객체를 반환하거나 빈 객체를 반환합니다.

또한 여러 속성을 추가하거나 생략해야하는 경우 다음을 수행 할 수 있습니다.

<fieldset {...(bool ? {disabled:true} : {})} {...(bool ? {something:'123'} : {})}>

좀 더 정교한 속성 관리를 위해 JSX 외부의 속성을 사용하거나 사용하지 않고 객체를 사전 제작하는 것이 좋습니다.


간단하면서도 매우 유용한 답변에 감사드립니다!
tommygun

4

모든 속성에 대해 작동하는 동적 속성을 수행하는 더 깨끗한 방법은

function dynamicAttributes(attribute, value){
  var opts = {};
  if(typeof value !== 'undefined' && value !== null) {
    opts['"'+attribute+'"'] = value;
    return opts;
  }
  return false;
};

다음과 같이 반응 구성 요소를 호출하십시오.

<ReactComponent {...dynamicAttributes("disabled",false)}
{...dynamicAttributes("data-url",dataURL)}
{...dynamicAttributes("data-modal",true)} />

팁 :

  1. dynamicAttributes공통된 장소 / 유틸리티에서 기능을 가지고 모든 구성 요소에서 사용하도록 가져올 수 있습니다.

  2. null동적 속성을 렌더링하지 않도록 값을 전달할 수 있습니다.


이렇게하지 않는 이유 : <ReactComponent {... { "data-url": dataURL}} />? 단순이없이 "dynamicAttributes"필요
gdbdable

속성이 null 인 경우 해당 속성을 렌더링하기 위해 반응하는 것을 원하지 않습니다. 예 : "data-modal": null data-model = "null"을 표시하기 위해 반응하지 않습니다. 이 경우 위의 코드는 속성 즉, 값에 기반한 동적 속성을 표시하지 않습니다.
Venkat Reddy

2

문서에서 이와 유사한 것을 찾을 수 있습니다.

https://facebook.github.io/react/docs/transferring-props.html

귀하의 경우에는 다음과 같을 수 있습니다.

function MyComponent(props) {
    let { disabled, ...attrs } = props;
    if (disabled) {
        // thus, it will has the disabled attribute only if it
        // is disabled
        attrs = {
            ...attrs,
            disabled: true
        }
    };

    return (
        <button {...attrs}>MyLabel</button>
    )
}

이 코드는 ES6를 사용하고 있지만 아이디어를 얻었습니다.

이 구성 요소에 다른 많은 속성을 전달할 수 있고 여전히 작동하기 때문에 이것은 멋지다.


2

내가 사용한 버전은 다음과 같습니다.

<button disabled={disabled ? 'disabled' : undefined}>
    Click me (or dont)
</button>

코드에서 undefined를 사용하는 것은 나쁜 습관입니다. disabled는 true 또는 false를 반환하는 부울 변수이므로 간단히 <button disabled = {disabled}>를 작성할 수 있으므로 필요하지 않습니다.
Raphael Pinel

정의되지 않은 나쁜 습관은 왜입니까? 가능한 경우 인용. 또한 아마 제대로 지금 bools을 처리하지만, 제대로 작동하지 않을 것입니다 귀하의 제안을 작성 NHE 시간에 반응
AnilRedshift

2

간단하고 깨끗한 방법

<button {...disabled && {disabled: true}}>Clear cart</button>

비활성화는 이와 같은 소품에서 가져와야합니다.

<MyComponent disabled />

1

허용되는 솔루션보다 훨씬 더 깨끗한 솔루션은 AnilRedshift가 언급 한 솔루션입니다.

간단히 말해 HTML 속성에는 이름과 값이 있습니다. 간단히 말해서 "disabled", "multiple"등에 대해서만 이름을 사용할 수 있습니다. 그러나 longhand 버전은 여전히 ​​작동하며 React가 선호하는 방식으로 작동하도록 허용합니다.

disabled={disabled ? 'disabled' : undefined} 가장 읽기 쉬운 솔루션입니다.


0

먼저 간단히 확인할 수 있습니다.

<button disabled={true}>Button 1</button>
<button disabled={false}>Button 2</button>

참고 : ** disabled 값은 String이 아니며 Boolean 이어야합니다 .

이제 동적입니다. 간단히 쓸 수 있습니다.

<button type="button" disabled={disable}  
        onClick={()=>this.setSelectValue('sms')} >{this.state.sms}</button>

보시다시피 비활성화 된 속성을 사용하고 있으며 중괄호로 지역 변수 / 상태 변수가 될 수 있습니다. 변수 disable는 true / false 값을 포함합니다.


-3

이것은 작동 할 수 있으며, 비활성화 된 문제는 단순히 부울을 설정할 수 없다는 것입니다.

if(AppStore.cartIsEmpty()){
  return "<button disabled>Clear cart</button>"
}
else
{
  return "<button>Clear cart</button>"
}

나는 아무도 다른 답변 수락하기 전에 어떤 제안이 있는지 기다릴거야 .. 나는이에 의지해야 할 수도 있습니다 두려워
티미
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.