2014-10-17 14 views
9

Ich bin in persistent Probleme in meinem React Rendern.Invariante Verletzung in React Render ODER die richtige Art und Weise zu iterieren und in React

Dieser Code

/** @jsx React.DOM */ 
var AnswerRows = React.createClass({ 
    componentDidMount: function() { 
    }, 
    render: function() { 
    {this.props.answers.map(function(answer, i) { 
     return (
     <div id="answerRow"> 
      <label className="AnswerText"> 
      <input type="checkbox" value={answer.id} /> 
      {answer.text} 
      </label> 
     </div> 
    ); 
    }, this)} 
    } 
}); 

var QuizTaking = React.createClass({ 
    componentDidMount: function() { 
    }, 
    render: function() { 
    return (
     <div className="card-holder"> 
     <div className="showQuestionCard x-card host"> 
      <h3 dangerouslySetInnerHTML={{__html: this.props.question.text}}></h3> 
      <div className="answerRows"> 
      <AnswerRows answers={this.props.question.answers}/> 
      </div> 
      <div className='submitAnswers'></div> 
     </div> 
     <div className="paper-shadow-bottom"></div> 
     </div> 
    ) 
    } 
}) 

gibt mir Invariant Violation: AnswerRows.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object. Fehler. Allerdings funktioniert dies jedes Mal: ​​

/** @jsx React.DOM */ 

var TestIndex = React.createClass({ 

    propTypes: { 
    }, 
    loadTest: function(i) { 
    window.location.replace(this.props.tests[i].url.replace(".json", "/take")) 
    }, 

    render: function() { 
    return(
     <div className="testTable card-holder"> 
     <div className="card-contents"> 
      {this.props.tests.map(function(test, i) { 
      return (
       <div className="testTableRow x-card host" key={test.id}> 
       <label className="__TITLE">{test.title} 
        <button onClick={this.loadTest.bind(test, i)} key={i} type="button" className="StartButton paper-button raisedButton">Start this test</button> 
       </label> 
       <div className="paper-shadow-bottom"></div> 
       </div> 
      ); 
      }, this)} 
     </div> 
     </div> 
    ) 
    } 
}); 

ich wirklich verstehen möchte, was hier vor sich geht, und vielleicht auch die ‚richtigen‘ Weg, es zu tun.

Antwort

25

Sie können nicht mehrere Elemente (wie das von der Map-Funktion zurückgegebene Array) von der Renderfunktion zurückgeben. Außerdem fehlt eine Rückgabeanweisung. Versuchen Sie dies:

var AnswerRows = React.createClass({ 
    componentDidMount: function() { 
    }, 
    render: function() { 
    return (
     <div> 
     {this.props.answers.map(function(answer, i) { 
      return (
      <div id="answerRow"> 
       <label className="AnswerText"> 
       <input type="checkbox" value={answer.id} /> 
       {answer.text} 
       </label> 
      </div> 
     ); 
     }, this)} 
     </div> 
    ); 
    } 
}); 
+2

Können Sie die letzte Zeile innerhalb der div erklären? Warum wird dies in die Karte übertragen? – monkeyjumps

+0

Bitte erläutern Sie weiter. Ich stoße auf genau dieses Problem und verstehe die Lösung nicht vollständig. – sweeds

+1

@monkeyjumps Dies stellt sicher, dass der Wert von "this" innerhalb der Funktion, die an map übergeben wird, mit dem Wert von this in der Renderfunktion übereinstimmt. Weitere Informationen finden Sie in der Dokumentation der Karte https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map – Becojo

Verwandte Themen