2017-07-07 1 views
2

Ich habe eine map() Funktion, die Ansichten basierend auf einer Bedingung anzeigen muss. Ich habe in der Dokumentation Reagieren sehe, wie die Bedingungen zu schreiben und dies ist, wie Sie eine Bedingung schreiben:Wenn Bedingung innerhalb von map() React

{if (loggedIn) ? (
    // Hello! 
) : (
    // ByeBye! 
)} 

Hier ist der Link: https://facebook.github.io/react/docs/conditional-rendering.html#inline-if-else-with-conditional-operator

So habe ich versucht, dieses Wissen zu nehmen und implemant es in meiner React App. Und es stellte sich so heraus:

render() { 
    return (
    <div> 
     <div className="box"> 
     {this.props.collection.ids 
      .filter(
      id => 
       // note: this is only passed when in top level of document 
       this.props.collection.documents[id][ 
       this.props.schema.foreignKey 
       ] === this.props.parentDocumentId 
     ) 
      .map(id => 
      {if (this.props.schema.collectionName.length < 0 ? (

       <Expandable> 
       <ObjectDisplay 
        key={id} 
        parentDocumentId={id} 
        schema={schema[this.props.schema.collectionName]} 
        value={this.props.collection.documents[id]} 
       /> 
       </Expandable> 

      ) : (
       <h1>hejsan</h1> 
      )} 
     )} 
     </div> 
    </div> 
) 
} 

Aber es funktioniert nicht ..! Hier ist der Fehler:

Screenshot

ich alle Hilfe schätzen die ich bekommen kann!

+1

Der Fehler ist eine Syntax eins und basiert auf der Tatsache, dass Sie versuchen, einen [** ternary operator **] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference) zu verwenden/Operatoren/Conditional_Operator) _and_ an [** if **] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if ...else) Anweisung falsch. – Pineda

Antwort

6

Sie verwenden beide ternary operator und if Zustand, verwenden Sie einen.

von ternären Operator:

.map(id => { 
    return this.props.schema.collectionName.length < 0 ? 
     <Expandable> 
      <ObjectDisplay 
       key={id} 
       parentDocumentId={id} 
       schema={schema[this.props.schema.collectionName]} 
       value={this.props.collection.documents[id]} 
      /> 
     </Expandable> 
    : 
     <h1>hejsan</h1> 
} 

Durch wenn Bedingung:

.map(id => { 
    if(this.props.schema.collectionName.length < 0) 
     return <Expandable> 
        <ObjectDisplay 
         key={id} 
         parentDocumentId={id} 
         schema={schema[this.props.schema.collectionName]} 
         value={this.props.collection.documents[id]} 
        /> 
       </Expandable> 
    return <h1>hejsan</h1> 
} 
+0

Danke, Mann! Ich habe bemerkt, dass ich beide verwendet habe: // Welches ist bevorzugt? –

+1

Es ist von Fall zu Fall, aber der grundlegende Unterschied ist, dass If-Else-Klausel ein Konstrukt ist, Ternär ist ein Ausdruck. Und in JSX kann nur ein Ausdruck ** direkt ** unter dem JS-Block '{}' platziert werden. –

+0

ich denke in erster Linie meinung basiert, aber was ich bevorzuge ist: Wenn Sie nur eine Bedingung überprüfen möchten, dann verwenden ternären Operator sonst verwenden Sie if/else Leiter für mehrere Bedingungen :) –

1

Entfernen Sie das Schlüsselwort if. Es sollte nur predicate ? true_result : false_result sein.

Auch ? : heißt ternärer Operator.

+0

Man kann 'if' innerhalb einer Funktion haben. Auch wenn ein Ternär ** auch ** funktioniert, sollten Sie nicht vorschlagen, etwas technisch einwandfreies zu entfernen. – Chris

+2

@Chris: Das ist ein fairer Kommentar, aber der OP-Fehler basiert auf einem Syntaxfehler, der durch den Versuch erzeugt wurde, sowohl eine 'if'-Anweisung als auch den ternären Operator falsch zu kombinieren ... – Pineda

1

Es gibt zwei Syntaxfehler in Ihrem dreifach konditionalen:

  1. das Stichwort entfernen if. Überprüfen Sie die korrekte Syntax here.
  2. Ihnen fehlt eine Klammer in Ihrem Code. Wenn Sie es wie folgt formatiert:

    {(this.props.schema.collectionName.length < 0 ? 
        (<Expandable></Expandable>) 
        : (<h1>hejsan</h1>) 
    )} 
    

Hope this funktioniert!

0

Sie mischen if-Anweisung mit einem ternären Ausdruck, deshalb haben Sie einen Syntaxfehler. Es könnte einfacher sein, für Sie zu verstehen, was los ist, wenn Sie Mapping-Funktion außerhalb Ihres Render-Methode extrahieren:

renderItem = (id) => { 
    // just standard if statement 
    if (this.props.schema.collectionName.length < 0) { 
     return (
      <Expandable> 
       <ObjectDisplay 
        key={id} 
        parentDocumentId={id} 
        schema={schema[this.props.schema.collectionName]} 
        value={this.props.collection.documents[id]} 
       /> 
      </Expandable> 
     ); 
    } 
    return (
     <h1>hejsan</h1> 
    ); 
} 

Dann ist es nur nennen, wenn Mapping:

render() { 
    return (
     <div> 
      <div className="box"> 
       { 
        this.props.collection.ids 
         .filter(
          id => 
          // note: this is only passed when in top level of document 
          this.props.collection.documents[id][ 
           this.props.schema.foreignKey 
          ] === this.props.parentDocumentId 
         ) 
         .map(this.renderItem) 
       } 
      </div> 
     </div> 
    ) 
} 

Natürlich könnten Sie haben benutzte den ternären Ausdruck auch, es ist eine Frage der Präferenz. Was Sie jedoch verwenden, wirkt sich auf die Lesbarkeit aus. Überprüfen Sie daher, ob Sie überprüfen.