Реагуйте на foreach у JSX


109

У мене є об’єкт, який я хочу вивести через REACT

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

і мій компонент реакції (вирізаний), є ще одним компонентом

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;

як ви можете бачити з наведеного вище фрагмента, я намагаюся вставити масив компонента Answer, використовуючи масив Answers у реквізиті, він повторюється, але не виводиться в HTML.

Відповіді:


213

Вам потрібно передати масив елементів jsx. Проблема в тому, що forEachнічого не повертає (тобто повертає undefined). Тому краще використовувати, mapоскільки він повертає такий масив

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
Використовувати var i як ключ - це не найкращий вибір у деяких ситуаціях для віртуального дому.
maquannene

3
@maquannene Дійсно дякую, що вказали на це. Ось хороший допис про те, чому medium.com/@robinpokorny/…
cyberwombat,

1
FWIW ви також можете передати в інші види колекцій. Вам просто потрібно розгорнути їх, щоб вони працювали .map(). наприклад, Object.keys(collection).map(key => ...і призначити змінну для зручної роботиcollection[key]
Джон Кастер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.