Reagisci foreach in JSX


109

Ho un oggetto che desidero trasmettere tramite REACT

question = {
    text: "Is this a good question?",
    answers: [
       "Yes",
       "No",
       "I don't know"
    ]
} 

e il mio componente di reazione (tagliato), è un altro componente

class QuestionSet extends Component {
render(){ 
    <div className="container">
       <h1>{this.props.question.text}</h1>
       {this.props.question.answers.forEach(answer => {     
           console.log("Entered");  //This does ifre                       
           <Answer answer={answer} />   //THIS DOES NOT WORK 
        })}
}

export default QuestionSet;

come puoi vedere dallo snippit sopra, sto cercando di inserire un array del componente Answer usando l'array Answers in props, ittera ma non viene emesso in HTML.

Risposte:


213

Devi passare un array di elementi a jsx. Il problema è che forEachnon restituisce nulla (cioè restituisce undefined). Quindi è meglio usarlo mapperché restituisce un array come questo

class QuestionSet extends Component {
render(){ 
    <div className="container">
       <h1>{this.props.question.text}</h1>
       {this.props.question.answers.map((answer, i) => {     
           console.log("Entered");                 
           // Return the element. Also pass key     
           return (<Answer key={i} answer={answer} />) 
        })}
}

export default QuestionSet;

7
Utilizzare var i come chiave non è una buona scelta in alcune situazioni per il dominio virtuale.
maquannene

3
@maquannene davvero grazie per averlo fatto notare. Ecco un buon post sul perché medium.com/@robinpokorny/…
cyberwombat

1
FWIW puoi anche passare ad altri tipi di raccolte. Devi solo srotolarli in modo che funzionino con .map(). ad esempio Object.keys(collection).map(key => ...e assegnare una variabile per lavorare comodamente concollection[key]
John Kaster
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.