React foreach dans JSX


109

J'ai un objet que je veux sortir via REACT

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

et mon composant de réaction (réduit), est un autre composant

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;

comme vous pouvez le voir dans l'extrait ci-dessus, j'essaie d'insérer un tableau du composant Answer en utilisant le tableau Answers dans les accessoires, il itère mais n'est pas sorti en HTML.

Réponses:


213

Vous devez passer un tableau d'éléments à jsx. Le problème est que forEachcela ne renvoie rien (c'est-à-dire qu'il retourne undefined). Donc mieux utiliser mapcar il renvoie un tableau comme celui-ci

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
Utiliser var i comme clé n'est pas un bon choix dans certaines situations pour virtual dom.
maquannene

3
@maquannene Merci de l'avoir signalé. Voici un bon article sur pourquoi medium.com/@robinpokorny
...

1
FWIW vous pouvez également passer dans d'autres types de collections. Il vous suffit de les dérouler pour qu'ils fonctionnent avec .map(). par exemple Object.keys(collection).map(key => ...et assignez une variable pour travailler facilement aveccollection[key]
John Kaster
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.