JSXでforeachに反応する


108

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;

上記の抜粋からわかるように、小道具の配列Answersを使用してコンポーネントAnswerの配列を挿入しようとしています。これは繰り返し実行されますが、HTMLには出力されません。

回答:


212

要素の配列をに渡す必要があり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;

6
仮想DOMの状況によっては、キーとしてvariを使用することは適切ではありません。
maquannene

2
@maquannene確かにそれを指摘してくれてありがとう。ここではその理由には良い記事だmedium.com/@robinpokorny/...
cyberwombat

1
FWIWでは、他の種類のコレクションを渡すこともできます。それらが動作するように、それらを展開する必要があります.map()。たとえばObject.keys(collection).map(key => ...、便利に作業するための変数を割り当てますcollection[key]
John Kaster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.