我正在设置一个带有Rails后端的React应用程序。我得到的错误“对象是无效的React子(发现:对象与键{id,名称,信息,created_at, updated_at})。如果你想呈现一组子元素,请使用数组。”

这是我的数据:

[
    {
        "id": 1,
        "name": "Home Page",
        "info": "This little bit of info is being loaded from a Rails 
        API.",
        "created_at": "2018-09-18T16:39:22.184Z",
        "updated_at": "2018-09-18T16:39:22.184Z"
    }
]

我的代码如下:

import React from 'react';

class Home extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      error: null,
      isLoaded: false,
      homes: []
    };
  }

  componentDidMount() {
    fetch('http://localhost:3000/api/homes')
      .then(res => res.json())
      .then(
        (result) => {
          this.setState({
            isLoaded: true,
            homes: result
          });
        },
        // error handler
        (error) => {
          this.setState({
            isLoaded: true,
            error
          });
        }
      )
  }

  render() {

    const { error, isLoaded, homes } = this.state;

    if (error) {
      return (
        <div className="col">
          Error: {error.message}
        </div>
      );
    } else if (!isLoaded) {
      return (
        <div className="col">
          Loading...
        </div>
      );
    } else {
      return (
        <div className="col">
          <h1>Mi Casa</h1>
          <p>This is my house y'all!</p>
          <p>Stuff: {homes}</p>
        </div>
      );
    }
  }
}

export default Home;

我做错了什么?


当前回答

同样的错误,但场景不同。 我的状态是

        this.state = {
        date: new Date()
    }

所以当我在我的类组件中问它时,我有

p>Date = {this.state.date}</p>

而不是

p>Date = {this.state.date.toLocaleDateString()}</p>

其他回答

我希望它能帮助到其他人。

这个错误似乎也发生在你无意中发送一个复杂的对象,其中包括例如Date to React子组件。

它传递给子组件new Date('....')的示例如下:

 const data = {name: 'ABC', startDate: new Date('2011-11-11')}
 ...
 <GenInfo params={data}/>

如果你将它作为子组件参数的值发送,你将发送一个复杂的对象,你可能会得到如上所述的相同错误。

检查是否传递了类似的东西(在底层生成复杂的Object)。相反,您可以将该日期作为字符串值发送,并在子组件中执行新日期(string_date)。

只是添加到其他选项,我试图通过点方法访问主对象内的嵌套对象,如: this.state.arrayData.CompleteAdress.Location 在这种情况下,位置是完整地址内嵌套的对象,这就是为什么我不能简单地用点符号访问它。

因此,如果您面临同样的问题,请尝试JSON。解析,以便访问嵌套对象,然后进行相应操作。

当我将Date对象(例如firebse中的时间戳)发送到React子组件时,发生了这个错误。

如果你将它作为子组件参数的值发送,你将发送一个复杂的对象,你可能会得到如上所述的相同错误。

您必须将该日期作为字符串值发送

        <p>{timestamp.toString()}</p>

应该可以这样工作。

我也发生了错误,我通过删除花括号来解决它,希望它能帮助其他人。

你可以看到,我没有把con放在花括号里,错误发生了,当我移除粗括号时,错误消失了。

const modal = (props) => {
const { show, onClose } = props;

let con = <div className="modal" onClick={onClose}>
        {props.children}
        </div>;

return show === true ? (
    {con}
) : (
    <div>hello</div>
);

有一篇文章是关于花括号的用法的。点击这里

如果你想在不迭代的情况下显示所有对象,那么你必须将数据作为字符串值发送 即

  <p>{variableName.toString()}</>