2017-08-25 2 views
0
renderItems(game){ 

    if (game.category_id === 2) { 
     ownedGames.map((owned_game) => { 
      if (owned_game.game_id === game.game_id) { 
       renderPriceSection = renderOwned 
       console.log(owned_game.game_title) 
      } else { 
       renderPriceSection = renderPrice 
      } 
     }) 
    } else { 
     renderPriceSection = renderFreeToPlayTitle 
    } 

} 
... 
return(
    {renderPriceSection} 
) 

Ich versuche, einige Etiketten anzuzeigen: Owned, $Price, Freereagieren wird nur das letzte Element in dem Array Anzeige

Die console.log wird alle richtigen Spiele angezeigt werden, die die Owned Label haben sollte.

Aber auf der Seite, die Owned Label ist nur für das letzte Element zeigt sich im owned_games Array.

Eine Idee, warum das passiert?


Edit:

Ich entfernte die renderItems() Funktion und ersetzt {renderPriceSection} mit diesem:

{game.category_id === 2 ? 
     ownedGames.map(owned_game => 
      owned_game.game_id === game.game_id ? renderOwned : renderPrice 
     ) : 
     renderFreeToPlayTitle 
    } 

Nun ist die renderOwned und renderPrice wird für jedes Element wird angezeigt owned_games.length mal.
So jetzt bin ich auf der gegenüberliegenden Seite der falschen Ausgabe :)))

+0

Das passiert, weil renderPriceSection bei jeder Map-Iteration überschrieben wird. Auch dies ist kein richtiger Weg, um map zu verwenden, map gibt ein Array zurück und wenn Sie zeigen, wie Ihr Array aussieht und was Ihre erwartete Ausgabe ist, können wir vielleicht besser helfen –

+0

Da das Label nur für das letzte Element angezeigt wird, d dachte dasselbe. Dass es es überschreibt. Aber ich kann mir keinen besseren Weg vorstellen, dies zu tun. –

+0

Ich verwende 'map' anstatt einer for-Schleife, denke ich. Ich habe die Frage aktualisiert. –

Antwort

0

Array.map gibt ein anderes Array zurück. Es scheint, dass Sie nichts innerhalb Ihrer map Funktion zurückgeben. Es ist auch nicht klar, was renderPriceSelection sein soll.

renderPriceSelection = ownedGames.map((owned_game) => { 
    if (owned_game.game_id === game.game_id) { 
    return renderOwned 
    } else { 
    return renderPrice 
    } 
}) 

render {renderPriceSelection} 
+0

'renderPriceSection' ist nur eine letzte valriable, die entweder den Preis, das freie oder das eigene Label darstellt. Ich versuche, in einem sehr kleinen Maßstab zu reproduzieren. –

+0

Verwenden Sie die Map ähnlich wie ich es damals beschrieben habe und 'console.log (renderPriceSelection)', um zu überprüfen, ob dies das ist, was Sie wollen oder nicht. – mersocarlin

0

Da Sie den gleichen Bezug von renderPriceSection auf jeder anderen Iteration modifizieren Sie das gleiche Objekt ändern, Sie sind nicht einen neuen erstellt.

0

Von diesem Code nicht ganz klar, aber es scheint mir, dass Sie die Variable renderPriceSection bei jeder Iteration neu zu schreiben, und das ist, warum renderItems das letzte Element kehrt jedes Mal

0

Sie speichern die renderPriceSelection in Form eines Array wie unten, und dann dieses Array rendern, wenn Sie Werte von dieser angegebenen Funktion zurückgeben, hier habe ich als Listenelemente zurückgegeben. Ich hoffe es hilft.

renderItems(game){ 

    renderPriceSection = []; 

    if (game.category_id === 2) { 
    ownedGames.map((owned_game) => { 
     if (owned_game.game_id === game.game_id) { 
      renderPriceSection.push(renderOwned); 
      console.log(owned_game.game_title) 
     } else { 
      renderPriceSection.push(renderPrice); 
     } 
     }) 
    } else { 
     renderPriceSection.push(renderFreeToPlayTitle); 
    } 

} 

... 
return(
    <ul> 
     {renderPriceSection.map((eachPrice) => <li>eachPrice</li>)} 
    </ul> 
) 
Verwandte Themen