2016-05-03 9 views
0

Ich möchte in der Lage sein, einen bestimmten HTML-Abschnitt zu rendern, wenn die Bedingung wahr ist. Ich bin neugierig auf die korrekte Art, einen bedingten if-Ausdruck innerhalb einer react render() zu erstellen.Wie Sie einen bedingten Ausdruck (if) in einem React render() korrekt einrichten

Ich schaute online nach und fand eine Möglichkeit, dies mit einem Inline-Ausdruck zu tun, um zu überprüfen, ob der Wert wahr ist, wenn ja, dann wird das verbleibende Element gerendert.

Ich habe auch eine andere Möglichkeit, um Variablen für die HTML-Rendering zu erstellen.

Frage:

Ich war nicht in der Lage, beide td Tags als einen für den Zustand zu wickeln. Es sieht so aus, als müsste dies per td Tag gemacht werden.

Gibt es eine Möglichkeit, dies um beide Tags herum zu tun oder muss ein anderes Element um sie herum eingerichtet werden?

Ich dachte, dies könnte auch mit einer => Funktion möglicherweise eingerichtet werden.

-Code für die Inline() Ausdruck machen:

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

Code Schaltflächen erstellen außerhalb der Render()

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

Antwort

2

JSX ermöglicht es Ihnen nicht, 2 nebeneinander Elemente zurückzugeben. Es kann nur 1 Element zurückgeben. Also können Sie diese 2 entweder in ein einzelnes Element einbinden und die gleiche Bestätigung verwenden wie jetzt.

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

Sie können auch inline self invoked function verwenden und eine Reihe von JSX Elemente zurück. (die Rendermethoden werden automatisch durchlaufen und rendern). Hier verwende ich ES6 Pfeil Funktion direkt den this Bezug zu binden, aber es ist wahrscheinlich machbar mit einer normalen Funktion und Bindung mit der Hand wie dieser .bind(this)

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

@Raphael_Parent Ja, ich habe die ES6-Pfeilfunktion wie auf der React-Website gesehen. Ich habe diese Methode ausprobiert und es funktioniert auch. Ich bin neu zu reagieren und von all den 3 verschiedenen Arten, die oben diskutiert wurden, finde ich den, der die tds in einer Variablen einrichtet, die am einfachsten zu lesen ist. Ich bin neu zu reagieren, also bin ich mir nicht sicher. Wäre dies als eine richtige Lösung gedacht oder sollte dies versucht werden, in den Rückkehrkörper zu stoßen? Ich finde es viel einfacher, Setup mit der If-Anweisung und Variablendeklaration vor der Rückkehr zu lesen, wie im zweiten Codeabschnitt oben gezeigt. – ALM

+0

@ALM Es ist eine richtige Lösung für Ihre Frage. Du hast gefragt: "Gibt es eine Möglichkeit, dies um beide Tags herum zu tun oder musst du ein anderes Element um sie herum einrichten?" Und ich antwortete :). Es gibt einen Weg, es funktioniert, es ist ein bisschen weniger lesbar. Es liegt an dir! Ich hätte nichts dagegen, das eine oder andere zu sehen. –

+0

@Raphael_Parent Ich verstehe Ihre Antwort ist die Frage, ich kann es richtig markieren. Ich wollte wissen, ob eine dieser 3 Lösungen besser ist als eine andere? Meine bevorzugte Lösung ist die, die ich in meinem zweiten Codebeispiel angegeben habe, und ich möchte nur sicherstellen, dass es in Ordnung ist, um so zu reagieren, wie ich neu bin. Danke – ALM

1

Sie benötigen einen ternary Ausdruck

Zustand zu benutzen? 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> 
    ) 
    } 

Es ist nicht möglich, mehr als ein Inline zu verwenden. Die Dokumentation und die Beispiele von React verwenden ternäre Operationen und empfehlen sie als Standardmuster. Wenn Sie eine Methode gegenüber der anderen bevorzugen, sind sie beide gültig, haften Sie nur um der Konsistenz willen :)

+0

Hallo John. Ich weiß, wie man eine zweite Bedingung hinzufügt, ich wollte wissen, ob es eine Möglichkeit gibt, beide TDs in demselben Bedingungsausdruck zu haben. Auch wenn eine Methode als besser angesehen wird als die andere. – ALM

+0

@ALM nein es ist nicht möglich, es inline zu tun. Die Antwort, die ich gegeben habe, ist das bevorzugte Muster mit reactive, bei dem Sie mehrmals nach demselben Objekt suchen, aber es muss immer ein einzelnes Element auf hoher Ebene zurückgegeben werden, so dass JSX weiß, um welchen Baum es sich handelt. Es ist jedoch nur auf die Benutzerpräferenz zurückzuführen. Wenn Sie eins über dem anderen mögen, sind beide gültig.also stellen Sie nur sicher, dass Sie konsistent mit der Implementierung sind, die Sie verwenden –

+0

Also sollten Sie immer beide zur Verfügung stellen, damit es das eine oder andere rendern kann? Würde es nicht standardmäßig leer sein, da nichts bereitgestellt wurde? Ich versuche nur zu sehen, gibt es einen Unterschied zu JSX zwischen dem, was du geschrieben hast und was ich geschrieben habe? Sie werden beide gleich rendern, ich gebe nur die Null nicht zurück. – ALM