반응 : 조건부로 prop을 컴포넌트에 전달


85

if 문을 사용하는 것보다 조건부로 prop을 전달하는 더 좋은 방법이 있는지 알고 싶습니다.

예를 들어, 지금은 다음과 같습니다.

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    if(this.props.editable) {
      return (
        <Child editable={this.props.editableOpts} />
      );
    } else {
      // In this case, Child will use the editableOpts from its own getDefaultProps()
      return (
        <Child />
      );
    }
  }
});

if 문없이 이것을 작성하는 방법이 있습니까? JSX에서 inline-if-statement 유형의 라인을 따라 무언가를 생각하고 있습니다.

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    return (
      <Child 
        {this.props.editable ? editable={this.props.editableOpts} : null} 
      />
    );
  }
});

마무리하려면 : 나는 prop for를 정의하는 방법을 찾으려고 노력하고 Child있지만 값을 전달하거나 다른 것을 수행하여 Child여전히 Child자신 의 값을 가져옵니다 getDefaultProps().


코드도 포함 할 수 있습니까 Child? 또한 <Child editableOpts={this.props.editableOpts} />대신 말하려고 <Child editable={this.props.editableOpts} />했습니까?
Jim Skerritt 2015-08-26

@JimSkerritt 나는 그것이 그렇게 보이는 것을 알고 있지만 소품을 혼동하지 않았습니다. 나는 사용하려고하는데 react-bootstrap-table그것이 그들이 사용하는 형식입니다. 나는 확실하지 않다 Child코드는 실제로 내가이를 포함시키지 않은 이유입니다, 부탁 해요 무엇을 중요. 나는 정말로 선택적으로 prop을 전달하거나 전달하지 않는 방법을 찾고 있는데, .NET의 Childif 문에 막대한 양의 유사한 코드가 필요하지 않습니다 Parent.
Matthew Herbst

1
Gotcha, 그냥 확인 :) 곧 답변을
드릴게요

답변:


151

당신은 당신의 아이디어에 가깝습니다. undefined소품 을 전달 하는 것은 그것을 전혀 포함하지 않는 것과 동일하며 여전히 기본 소품 값을 트리거합니다. 따라서 다음과 같이 할 수 있습니다.

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    return <Child 
      editable={this.props.editable ?
                  this.props.editableOpts : 
                  undefined}
    />;
  }
});

오, 대단해! 문서 어딘가에서 찾았습니까? 나는 찾고했지만 빠른 검색 동안 아무것도 찾을 수 없습니다
마태 복음 HERBST을

확실하지가, 사용하는 동안 내가 배운 뭔가 반작용 : 문서에의하거나하지 않을 경우
짐 Skerritt

10
nullundefinedBTW 와 같은 힘으로 무장하지 않았습니다 .
시즌

3
유용한 트릭! 효과적으로 조건부 렌더링 기술을 사용하는 방법에 대한 좋은 자료가 있었으면
nicodjimenez

1
에서 false나를 위해 내가 원하는 방식으로 작동하지 않는 경우 - 난 여전히 키 - 값 쌍을 얻을 : property: null. 단일 JSX 요소로 어떻게 든 할 수 있습니까?
Gal Grünfeld

29

에 스프레드 연산자를 추가합니다 this.props.editable.

<Child {...(this.props.editable ? {editable: {this.props.editableOpts}} : {})} >

작동해야합니다.


1
이것은 editable = {this.props.editable과 동일한 결과를 산출하지 않습니까? this.props.editableOpts : undefined} 아니면 차이점이 있습니까?
garyee 19

1
@garyee : 차이점은 일부 구성 요소가 undefined재정의 (예 null: 항상 재정의) 로 잘못 처리 될 수 있으므로 잘못된 값으로 설정하는 대신 기본값을 유지하는 유일한 방법은 명시 적으로 전달하지 않고 전달하지 않는 것입니다. undefined.
Yann Dìnendal

@ YannDìnendal <Child {... (this.props.editable? {editable : {this.props.editableOpts}} : {)}>처럼 정의되지 않은 대신 빈 개체를 사용하면 어떻게 되나요? 어느 것이 더 낫습니까?
sktguha

1
@sktguha : 예, 정말 오타처럼 보입니다. 정의되지 않은 상태로 퍼질 수 없으므로 {}마지막에 있어야합니다 . 나는 판을 제안 할 것이다, 감사합니다 :)
Yann Dìnendal

18

props변수 정의 :

let props = {};
if (this.props.editable){
  props.editable = this.props.editable;
}

그런 다음 JSX에서 사용하십시오.

<Child {...props} />

다음은 코드의 솔루션입니다.

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    let props = {};
    if (this.props.editable){
      props.editable = this.props.editable;
    }
    return (
      <Child {...props} />
    );
  }
});

소스, React 문서 : https://facebook.github.io/react/docs/jsx-in-depth.html#spread-attributes


이 솔루션이 마음에 듭니다. 내가 사용하는 거라고 childProps하지만 혼란을 방지하기 위해
다니엘 레이나

4

실제로 prop이 boolean이면 조건을 구현할 필요가 없지만 인라인 조건으로 prop을 추가하려면 아래와 같이 작성해야합니다.

const { editable, editableOpts } = this.props;
return (
  <Child {...(editable && { editable: editableOpts } )} />
);

혼동하지 않기를 바랍니다. {...: 수단이 확산 운영자는 존재 소품 통과 비슷 {...props}하고 editable &&있다면 수단을 editable하다 개체를 만들고 함께합니다 우리가 같은 새 개체를 만들 것입니다 : 그것은 의미 하지만 경우는 사실이다.true{ editable: editableOpts }{...{...{ editable: editableOpts }}editable={editableOpts}this.porps.editable


0
var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    return (
      <Child 
        {...(this.props.editable && {editable=this.props.editableOpts})} 
      />
    );
  }
});

정의 된 경우 소품을 전달합니다. 그렇지 않으면 소품이 전달되지 않습니다. 다른 답변에서는 소품이 여전히 전달되지만 값은 undefined여전히 소품이 전달되고 있음을 의미합니다.


1
undefinedprop에 전달 하는 것은 전달하지 않는 것과 같습니다.
Matthew Herbst

네 이해했습니다. 나는 그것이 명확하기를 원했습니다! 감사!
sanair96

0

또한이 짧은 방법을 시도 할 수 있습니다

 <Child {...(this.props.editable  && { editable: this.props.editableOpts })} />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.