2016-05-03 6 views
0

条件が真である場合、HTMLの特定のセクションをレンダリングできるようにします。私は、react render()内の条件if式を設定する正しい方法について興味があります。Reactレンダー()内の条件式(if)を正しく設定する方法

オンラインで調べて、インライン式でこれを行う方法を見つけて、値が真であるかどうかを確認し、そうであれば残りの要素をレンダリングします。

また、レンダリングするhtmlの変数を作成する別の方法を設定しました。

質問:

私は条件の一つとして、両方のtdタグをラップすることができませんでした。これは、tdタグごとに行う必要があるようです。

両方のタグの周りでこれを行う方法はありますか、またはそれらの周りに別の要素を設定する必要がありますか?

おそらく=>機能を使用して設定することもできます。

コードインラインのレンダリング()式:

render() { 

    // get the data from the JSON entity for each attribute 
    var tdsForObject = this.props.jsonAttributes.map(jsonAttribute => 
     <td>{this.props.object.entity[jsonAttribute]}</td> 
    ); 

    return (
     <tbody> 
     <tr> 
      {tdsForObject} 
      {this.props.objectTypeEditable && 
      <td> 
       <UpdateDialog object={this.props.object} 
         objectName={this.props.objectName} 
         attributes={this.props.attributes} 
         onUpdate={this.props.onUpdate}/> 
      </td> 
      } 
      {this.props.objectTypeEditable && 
       <td> 
       <button onClick={this.handleDelete}>Delete</button> 
      </td> 
      } 
     </tr> 
     </tbody> 
    ) 
    } 

コード(レンダリングの外にボタンを作成する)

render() { 

    // get the data from the JSON entity for each attribute 
    var tdsForObject = this.props.jsonAttributes.map(jsonAttribute => 
     <td>{this.props.object.entity[jsonAttribute]}</td> 
    ); 

    var updateButton; 
    var deleteButton; 

    // if the object can be edited create the update and delete buttons 
    if (this.props.objectTypeEditable) { 
     updateButton = (
     <td> 
      <UpdateDialog object={this.props.object} 
        objectName={this.props.objectName} 
        attributes={this.props.attributes} 
        onUpdate={this.props.onUpdate}/> 
     </td> 
    ); 

     deleteButton = (
     <td> 
      <button onClick={this.handleDelete}>Delete</button> 
     </td> 
    ); 
    } 

    return (
     <tbody> 
     <tr> 
      {tdsForObject} 
      {updateButton} 
      {deleteButton} 
     </tr> 
     </tbody> 
    ) 
    } 

答えて

2

JSXでは2つの並んだ要素を返すことはできません。それは1要素だけを返すことができます。だからええ、1つの要素の中にそれらの2つをラップすることができますし、今と同じ検証を使用することができます。

{this.props.objectTypeEditable && 
    <div class="wrapper"> 
     <td> 
      [...] 
     </td> 
     <td> 
      [...] 
     </td> 
    </div> 
} 

inline self invoked functionを使用して、JSX要素の配列を返すこともできます。 (レンダリングメソッドは自動的にループしてレンダリングします)ここで私は直接this参照をバインドするES6矢印機能を使用しますが、それはおそらく正常な機能を持つなんとかです。この.bind(this)

{(() => { 
    let elements = []; 
    if(this.props.objectTypeEditable) { 
     // push td elements in array 
    } 
    return elements; 
})()} 
+0

@Raphael_ParentはいReactのウェブサイトに表示されているように、私はES6の矢印機能を見ました。私はこの方法を試して、それも同様に動作します。私は反応するのが新しく、上で議論した3つのタイプすべての中から、最も簡単に読むことができる変数にtdを設定することがわかります。私は反応が新しいので、私は確信していません。これは正しい解決策と考えられるのでしょうか、それとも返却団体に押し込もうとしますか?上記の2番目のコードのセクションで示されているように、return文の前にif文と変数宣言を使って設定を読み込む方がはるかに簡単です。 – ALM

+0

@ALMあなたの質問には正しい解決策です。あなたは「両方のタグの周りにこれを行う方法はありますか?あるいは、それらの周りに別の要素を設定する必要がありますか?」と私は答えました。方法はありますが、それは少し読みにくいです。それはあなた次第です!私はどちらか他を見て気にしません。 –

+0

@Raphael_Parent私はあなたの答えが正しいことを理解しています。私はこれらの3つのソリューションのいずれかが他のものより優れていることを知りたがっていましたか?私の好みの解決策は、私が2番目のコード例で提供したものです。私はそれが新しいものとして反応する方法でその大丈夫を確認したいだけです。 ありがとう – ALM

1

あなたはternary表現

条件を使用する必要がありますか? expr1の:expr2の

render() { 

    // get the data from the JSON entity for each attribute 
    var tdsForObject = this.props.jsonAttributes.map(jsonAttribute => 
     <td>{this.props.object.entity[jsonAttribute]}</td> 
    ); 

    return (
     <tbody> 
     <tr> 
      {tdsForObject} 
      { this.props.objectTypeEditable 
      ? <td> 
       <UpdateDialog object={this.props.object} 
         objectName={this.props.objectName} 
         attributes={this.props.attributes} 
         onUpdate={this.props.onUpdate}/> 
       </td> 
      : null 
      } 
      { this.props.objectTypeEditable 
      ? <td> 
       <button onClick={this.handleDelete}>Delete</button> 
       </td> 
      : null 
      } 
     </tr> 
     </tbody> 
    ) 
    } 

複数のインラインを使用することはできません。 Reactのドキュメンテーションと例は、三項演算を使用し、それをデフォルトパターンとして推奨しています。他の方法よりも1つの方法を好む場合は、どちらも有効です。一貫性のために1つに固執してください:)

+0

こんにちはジョンのように手でそれを結合します。私は2番目の条件を追加する方法を知っている、私は同じ条件式の両方のTDを持っている方法があるかどうかを知りたかったのですか?また、ある方法が他の方法よりも優れていると考えられる場合。 – ALM

+0

@ALMいいえインラインではできません。私が与えた答えは、同じことを何度もチェックする反応パターンですが、JSXがそのツリーが何であるかを知るために常に返されるハイレベルの単一要素がなければなりません。しかし、それは実際にはユーザーの好みに左右されます。あなたが1つを他のものよりも好きなら、それらはどちらも有効です。したがって、使用する実装と一貫していることを確認してください。 –

+0

それで、どちらか一方をレンダリングできるように、常に両方を提供する必要がありますか?何も提供されていないので空にデフォルトしないでしょうか?私はあなたが書いたものと私が書いたものの間にJSXとの違いがあるのを見てみようとしていますか?彼らはどちらも同じものをレンダリングします。私はnullを返さないだけです。 – ALM

関連する問題