ReactCompositeComponent.render():必须返回有效的ReactComponent。您可能已返回undefined,数组或其他一些无效对象

时间:2016-03-14 14:33:26

标签: javascript ruby-on-rails-4 coffeescript react-rails

我在控制台中遇到上述错误,即使我正确地返回要渲染的Component。 errorTexts = ["email is invalid"]在以下代码中的值

if(@state.errorTexts.length>0)
            dangerouslySetInnerHTML: {
              __html: ReactDOMServer.renderToString(
                React.createElement AdminError, errorTexts: @state.errorTexts
              )
            }

AdminError组件包含以下代码:

#app/assets/javascripts/components/adminerror.js.coffee
@AdminError = React.createClass

  getDefaultProps: ->
    errorTexts: []

  render: ->
    for errorText in @props.errorTexts
      dom.div
        className: 'help-block'
        errorText

这个组件的JS等价物是:

(function() {
  this.AdminError = React.createClass({
    getDefaultProps: function() {
      return {
        errorTexts: []
      };
    },
    render: function() {
      var errorText, i, len, ref, results;
      ref = this.props.errorTexts;
      results = [];
      for (i = 0, len = ref.length; i < len; i++) {
        errorText = ref[i];
        results.push(dom.div({
          className: 'help-block'
        }, errorText));
      }
      return results;
    }
  });

}).call(this);

从AdminError组件返回的结果值显示在下面的屏幕截图中,但是,我不确定返回的对象类型是否可接受,因为它在for循环中: enter image description here

更新 修改了AdminError组件中的代码以修复此error

#app/assets/javascripts/components/adminerror.js.coffee
@AdminError = React.createClass

  getDefaultProps: ->
    errorTexts: []

  render: ->
    dangerouslySetInnerHTML: {
      __html: marked((
        dom.div null,
          for errorText, index in @props.errorTexts
            dom.div
              key: index
              className: 'help-block'
              errorText

      ).toString())
    }

再次出现此错误:

Uncaught Invariant Violation: ReactCompositeComponent.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.invariant

2 个答案:

答案 0 :(得分:2)

React只接受从render返回的一个父元素。从代码看起来你回来了几个。试试这个:

// your code ...
return (
   <div>
     {results}
   </div>
)

我不确定咖啡脚本中会有什么,但基本的想法是你需要将你的回报换成单个父元素。

答案 1 :(得分:1)

render方法不能返回多个元素,它必须只返回一个。所以将列表包装在另一个DOM元素中:

render: ->
  dom.div null,
    for errorText in @props.errorTexts
      dom.div
        className: 'help-block'
        errorText