【问题标题】:Invariant Violation in React Render OR the proper way to iterate and return in ReactReact 渲染中的不变违规或在 React 中迭代和返回的正确方法
【发布时间】:2014-10-17 17:56:02
【问题描述】:

我在我的 React 渲染中遇到了持续存在的问题。

这段代码

/** @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>
    )
  }
})

会给我Invariant Violation: AnswerRows.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object. 错误。但是,这每次都有效:

/** @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>
    )
  }
});

我真的很想了解这里发生了什么,也许是“正确”的方法。

【问题讨论】:

    标签: javascript reactjs react-jsx


    【解决方案1】:

    您不能从渲染函数返回多个元素(如 map 函数返回的数组)。另外,您缺少退货声明。试试这个:

    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>
        );
      }
    });
    

    【讨论】:

    • 你能解释一下div里面的最后一行吗?为什么要传入地图?
    • 请进一步解释。我遇到了这个确切的问题并且不完全理解解决方案。
    • @monkeyjumps 这是为了确保传递给 map 的函数内部的this 的值与渲染函数内部的this 的值相同。更多详情请参考地图文档developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • @sweeds 确保您在渲染函数中只返回一个节点。您不能返回包含多个节点的数组。如果要这样做,则必须将其包装在另一个元素中,例如我给出的解决方案中的div
    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多