Reaguj na foreach w JSX


114

Mam obiekt, który chcę wyprowadzić za pośrednictwem REACT

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

a mój składnik reagowania (zmniejszony) jest kolejnym składnikiem

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;

jak widać na powyższym fragmencie, próbuję wstawić tablicę komponentu Answer, używając tablicy Answers we właściwościach, dokonuje itteracji, ale nie jest przesyłany do HTML.

Odpowiedzi:


224

Musisz przekazać tablicę elementów do jsx. Problem w tym, że forEachnic nie zwraca (czyli zwraca undefined). Więc lepiej użyj, mapponieważ zwraca tablicę taką jak ta

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={answer} answer={answer} />) 
        })}
}

export default QuestionSet;

8
Użycie var i jako klucza nie jest dobrym wyborem w niektórych sytuacjach dla wirtualnej domeny.
maquannene

4
@maquannene Rzeczywiście dzięki za wskazanie tego. Oto dobry post o tym, dlaczego medium.com/@robinpokorny/ ...
cyberwombat

1
FWIW możesz również przekazać w innych rodzajach kolekcji. Wystarczy je rozwinąć, aby działały .map(). np. Object.keys(collection).map(key => ...i przypisz zmienną do wygodnej pracy zcollection[key]
John Kaster
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.