反応:インラインで条件付きで小道具をコンポーネントに渡す


85

ifステートメントを使用するよりも条件付きで小道具を渡すためのより良い方法があるかどうか知りたいです。

たとえば、今私は持っています:

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の一種のインラインifステートメントに沿って何かを考えていました。

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} 
      />
    );
  }
});

まとめ:の小道具を定義する方法を見つけようとしていますが、その小道具の値を自分自身からプルするChildような値を渡します(または何か他のことをします)。ChildChildgetDefaultProps()


のコードも含めることができますChildか?また、<Child editableOpts={this.props.editableOpts} />代わりに言うつもりでした<Child editable={this.props.editableOpts} />か?
Jim Skerritt 2015

@JimSkerritt小道具を混同しませんでしたが、そのように見えることはわかっています。私は使用しようとしていますreact-bootstrap-table、そしてそれは彼らが使用するフォーマットです。Childコードが実際に私が求めているものにとって重要であるかどうかはわかりません。そのため、コードを含めませんでした。私は本当に、オプションで小道具を渡すか渡さない方法を探しChildていますParent。これは、のifステートメントに大量の同様のコードを含める必要がありません。
Matthew Herbst 2015

1
ガッチャ、チェックするだけです:)まもなく回答があります
Jim Skerritt 2015

回答:


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}
    />;
  }
});

ああ、すごい!どこかのドキュメントでそれを見つけましたか?私はそれを探していましたが、クイック検索中に何も見つかりませんでした
Matthew Herbst 2015

それがドキュメントにあるかどうかわからない、Reactの使用中に私が学んだこと:)
Jim Skerritt 2015

10
nullundefinedところで、のような力で武装していません。
シーズン

3
便利なトリック!条件付きレンダリング手法を効果的に使用する方法に関する優れたリソースがあればいいのにと思います
nicodjimenez 2017

1
false、それは私のために私が望んでいたように動作していない場合-私はまだキーと値のペアを取得します:propertynull。単一のJSX要素でそれをどうにかして行うことはまだ可能ですか?
ギャルGrünfeld

29

スプレッド演算子をthis.props.editable:に追加します

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

動作するはずです。


1
これは、editable = {this.props.editableと同じ結果をもたらしませんか?this.props.editableOpts:undefined}または違いはありますか?
garyee

1
@garyee:違いは、一部のコンポーネントが誤っundefinedてオーバーライドとして扱われる可能性があることです(たとえば、 null常にオーバーライドです)。したがって、デフォルト値を偽の値に設定する代わりに保持する唯一の方法は、明示的に渡さず、渡さないことです。undefined
ヤンDìnendal

@YannDìnendal<Child {...(this.props.editable?{editable:{this.props.editableOpts}}:{)}>のように、未定義ではなく空のオブジェクトを使用するとどうなりますか?どちらがいいですか?
sktguha

1
@sktguha:はい、確かにタイプミスのように見えます。未定義を広めることはできないので、はい、{}最後にあるはずです。私は、エディションを示唆してよ、ありがとう:)
ヤン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

実際、小道具がブール値の場合、条件を実装する必要はありませんが、インライン条件で小道具を追加する場合は、次のように記述します。

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
渡すundefined小道具にすると、すべての時にそれを渡していないことと同じです。
MatthewHerbst19年

はい、わかりました。はっきりさせたかっただけです!ありがとう!
sanair 9619年

0

また、この速記方法を試すことができます

 <Child {...(this.props.editable  && { editable: this.props.editableOpts })} />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.