我正在设置一个带有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;

我做错了什么?


您的数据家是一个数组,因此您必须使用array .prototype.map()迭代数组才能使其工作。

return (
    <div className="col">
      <h1>Mi Casa</h1>
      <p>This is my house y&apos;all!</p>
      {homes.map(home => <div>{home.name}</div>)}
    </div>
  );

我今天得到了同样的错误,但与这个问题中发布的场景相比,情况有所不同。希望下面的解决方案能帮助到一些人。

下面的渲染函数足以理解我的场景和解决方案:

render() {
    let orderDetails = null;
    if(this.props.loading){
        orderDetails = <Spinner />;
    }
    if(this.props.orders.length == 0){
        orderDetails = null;
    }
    orderDetails = (
        <div>
            {
                this.props.orders && 
                this.props.orders.length > 0 && 
                this.props.orders.map(order => (
                <Order 
                    key={order.id}
                    ingredient={order.ingredients}
                    price={order.price} />
                ))
            }
        </div>
    );
    return orderDetails;
}

在上面的代码片段中:如果return orderDetails作为return {orderDetails}发送,那么尽管'orderDetails'的值(值为<Spinner/>或null或与<Order />组件相关的JSX),这个问题中发布的错误仍然会弹出。

错误描述:React -dom.development.js:57未捕获的不变性违规:对象作为React子对象无效(发现:带有键{orderDetails}的对象)。如果要呈现子元素的集合,请使用数组。

我们不能从render()方法内部的返回调用中返回JavaScript对象。原因是React期望一些JSX, false, null, undefined, true在UI中呈现,而不是一些JavaScript对象,当我使用返回{orderDetails}时,我试图呈现,因此得到如上所述的错误。

有效:

<div />

<div></div>

<div>{false}</div>

<div>{null}</div>

<div>{undefined}</div>

<div>{true}</div>

无效:

<div>{orderDetails}</div> // This is WRONG, orderDetails is an object and NOT a valid return value that React expects.

Edit: I also got this error on my company's test server used by QA's for their testing. I pointed my local code to that test server and tested the scenario in which this error was reported by QA team and found NO ERROR in my local machine. I got surprised. I re-checked multiple number of times, re-checked the scenario with QA team and I was doing right but still I was not able to replicate the issue. I consulted my fellow devs but still were not able to figure out the root cause. So keeping with the information in the error message I started scanning all the code I had deployed in my last deployment commit ( to be more specific last 4-5 commits because I suspected it could be there from last few deployments but was caught in the current deployment), especially all the components I had developed and found that there was a component - inside which there was no specified condition being met so it was returning NOTHING from it. So see below sample pseudo code. I hope it helps.

render () {
return (
    {this.props.condition1 && (
       return some jsx 1
    )}

    {this.props.condition1 && (
       return some jsx 2
    )})
}

如果你在上面的伪代码中看到,如果条件1和条件2不满足,那么这个组件将从它呈现NOTHING,理想情况下,react组件必须从它返回一些JSX, false, null, undefined, true。


在JavaScript中,数组和集合是不同的,尽管它们有点相似,但在这里react需要一个数组。 您需要从集合中创建一个数组并应用它。

let homeArray = new Array(homes.length);
let i = 0

for (var key in homes) {
    homeArray[i] =  homes[key];
    i = i + 1;
}

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

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

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

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

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

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


有同样的问题,在我的情况下 1. 将字符串解析为Json 2. 确保在渲染视图时不试图显示整个对象,而是显示object.value

data = [
{
    "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"
}];
var jsonData = JSON.parse(data)

然后是我的观点

return (
<View style={styles.container}>
  <FlatList
    data={jsonData}
    renderItem={({ item }) => <Item title={item.name} />}
    keyExtractor={item => item.id}
  />
</View>);

因为我使用数组,我使用平面列表来显示,并确保我与对象一起工作。值,而不是对象,否则你会遇到同样的问题


好吧,在我的情况下,我想渲染的数据包含一个对象在数组中,因此,它会给出错误,所以对于其他人来说,请检查你的数据也一次,如果它包含一个对象,你需要将它转换为数组打印它的所有值,或者如果你需要一个特定的值,然后使用。

我的数据:

body: " d fvsdv"
photo: "http://res.cloudinary.com/imvr7/image/upload/v1591563988/hhanfhiyalwnv231oweg.png"
postedby: {_id: "5edbf948cdfafc4e38e74081", name: "vit"}       
//this is the object I am talking about.
title: "c sx "
__v: 0
_id: "5edd56d7e64a9e58acfd499f"
__proto__: Object

只打印单个值

<h5>{item.postedby.name}</h5>

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

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


虽然不是特定于答案,但此错误主要发生在在JavaScript上下文中使用{}错误地使用JavaScript表达式时。

例如

let x=5;

export default function App(){ return( {x} ); };

正确的做法是

let x=5;
export default function App(){ return( x ); };

我也遇到过同样的问题,但现在我很高兴解决了这个问题。

NPM I core-js 把这一行放到index.js文件的第一行。 进口core-js


我有一个类似的错误,而我正在创建一个自定义模式。

const CustomModal = (visible, modalText, modalHeader) => {}

问题是我忘记了功能组件只能有一个道具传递给他们,根据REACT文档:

这个函数是一个有效的React组件,因为它只接受一个 “props”(代表属性)对象参数与数据和 返回一个React元素。我们称这种组件为“功能组件” 因为它们是JavaScript函数。反应文档

Therefore when we want to pass several variables we need to wrap them into an object or an Array and pass the pointer to that array or object. And destructure it on the component side before invoking the component. Alternatively we can use curly braces to indicate that we are sending an object with identical property names and variables that contain the value of those properties, like in the example here. And then define the function also to destructure upon arrival of the properties contained in the object.

const CustomModal = ({visible, modalText, modalHeader}) => {}

如果你有多个值要传递给组件,你应该传递一个对象,在它的属性/变量周围用花括号括起来(假设它们有相同的名字)。


在您的状态下,home被初始化为一个数组 家庭:[]

在返回中,尝试呈现home(这是一个数组)。 < p >东西:{家园}< / p >

不能这样做——如果你想渲染它,你需要渲染一个数组到每个单独的项目。例如:使用map()

Ex:{家(item = >)的项目文件夹。


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

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

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

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

而不是

p>Date = {this.state.date.toLocaleDateString()}</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>
);

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


当我试图在接收道具的子组件上渲染对象时,我遇到了这个问题。

当我意识到我的代码试图呈现一个对象,而不是我试图呈现的对象键的值时,我修复了这个问题。


在我的情况下,我有一个添加的异步在app.js如下所示。

const App = async() => {
return(
<Text>Hello world</Text>
)
}

但这并不是必须的,在测试某些内容时,我已经添加了它,并且不再需要它。移除它之后,如下图所示,事情开始工作了。

 const App =() => {
    return(
    <Text>Hello world</Text>
    )
}

使用时刻格式,因为那是日期…转换为日期格式… 时刻(array_list_item.close_date) .format(“;”)}

注意:React不会在map函数中显示这种类型的日期格式

“created_at”:“2018 - 09 - 18 t16:39:22.184z”,


对象作为React子对象无效

我也得到了相同的错误,但情况不同。我正在学习react useReducer钩子,并实现了一个带有增量,减量和重置按钮的计数器,我试图在屏幕上显示计数,但我是上述错误。

在代码中,我声明了由useReducer钩子返回的count作为对象,我直接尝试返回它,而不是它的count属性

我应该返回count。我只返回count(对象本身)而不是property。

我们也可以stringify object并返回字符串。

import React, { useReducer } from "react";

const initialState = {
count:0,
}
const reducer = (state, action) => {
    switch (action.type) {
        case 'increment':
            return {count:state.count + 1}
        case 'decrement':
            return {count:state.count - 1}
        case 'reset':
            return initialState
        default:
            return state
    }
}

function CounterWithReducer(props) {
  const [count, dispatch] = useReducer(reducer, initialState);

  return (
    <>
      <h1>{count}</h1>
      <button onClick={()=>{dispatch({type:'increment'})}}>Increment</button>

      <button onClick={()=>{dispatch({type:"decrement"})}}>Decrement</button>
      <button onClick={()=>{dispatch({type:"reset"})}}>Reset</button>
    </>
  );
}

export default CounterWithReducer;

在上面的代码中

{数}

这个部分(在返回部分)是我犯错误的地方,我需要使用count.count而不是count

总结是,如果你试图在屏幕上显示对象,你既不能使用JSON.stringify(),也不能尝试显示对象的任何属性。

我正处于开发生涯的早期阶段,如果有拼写错误,请原谅我。


我面对的正是这个错误。在追踪这个问题的根本原因时,我发现FRONTEND代码(React)正在调用API,并通过访问该响应的某些属性在页面上显示响应! 在这种情况下,有两种情况

该属性在后台的响应中不存在(它会抛出不同的错误) 或 来自后端响应的属性是一个复杂的对象(对象中的对象),我们的前端React组件试图访问它, 但是无法读取,因为React需要一个STRING(通过直接访问特定的属性,例如Object.property)或数组。(这种情况下)

所以我们收到这个错误,因为React期待STRING但得到了对象(因为你在对象内部传递object)。

请检查发送响应的后端逻辑(API)。


我也遇到过类似的问题,但我的这个方法奏效了。 我的输出

但我犯的错误很简单。在我的内容是超过两个,我已经忘记包装作为一个数组。我没有给卡莉戴牙套。

import React from 'react'
import {Button} from './Button';
import {Link} from 'react-router-dom'
import './HeroSection.css';

function HeroSection({
    lightBg, topLine, lightText, lightTextDesc, headline, description, 
    buttonLabel, img,alt,imgStart}
) {
    return (
        <>
            <div className={lightBg? 'home__hero-section': 'home__hero-section darkBg'}>
                <div className='container'>
                    <div className="row home__hero-row" 
                    style={{display:'flex', flexDirection:imgStart==='start'?' row-reverse':'row'}}
                    >
                    <div className='col'>
                        <div className='home__hero-text-wrapper'>
                            <div className='topline'>{topLine}</div>
                            <h1 className={lightText? 'heading': 'heading dark'}>{headline}</h1>
 <p className={lightTextDesc? 'home__hero-subtitle': 'home__hero-subtitle dark'}> 
 {description}
 <Link to='/sign-up'>
     <Button buttonSize='btn--wide' buttonColor='blue'>
{buttonLabel}
     </Button>
 </Link>
 </p>
                        </div>

                    </div>

                    <div className='col'>
                        <div className='home__hero-img-wrapper'>
                      <img src={img} alt={alt} className='home_hero-img'/>
                        </div>
                    </div>
                    </div>

                </div>

            </div>

        </>
    );
}

export default HeroSection
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

在设置为UseState之前,我在使用BigNumber库的值时出现了这个错误:

const { toBN } = web3.utils;
...
 setOwner0Balance(toBN(await getBalance(owner0)));

同样的错误,但是不同的场景。我打算将我的自定义功能组件分配给第三方模块的layoutComponent道具。

错误代码:

customLayout = () => {
// function returning a component
}
//usage:
{customLayout}

Fix:

CustomLayout = () => {
// functional component
}
//usage:
<CustomLayout></CustomLayout>

我还捕捉到了另一个场景。要渲染的DOM依赖于一些检查。我用null初始化它,Switch给它赋值。在返回时,返回那个DOM。

export function test() {
  let DOM = null;
  switch (conditions) {
    case 1: {
      DOM = <div>SOME DIV</div>;
    }
    case 2: {
      DOM = <div>SOME DIV2</div>;
    }
    default: {
      DOM = null;
    }
  }
  return { DOM }; // -----1 Problem was here
}

它的分辨率是用<></>来包装它

return <>{DOM}</>

我也有同样的问题。在我的情况下,我没有呈现项目的价值。我最初的代码是,

        keyExtractor={(item, index) => item.id}
        data={courseGoals} 
        renderItem={itemData => (
          <View style={styles.listitem}> 
              <Text>{itemData.item}</Text> 
          </View>
        )} 
      />

我只是简单地加了一句。价值’,而且它起作用了!

        keyExtractor={(item, index) => item.id}
        data={courseGoals} 
        renderItem={itemData => (
          <View style={styles.listitem}> 
              <Text>{itemData.item.value}</Text> 
          </View>
        )} 
      />

为了我的案子

 return (
    <div >
      {updated.map((one) => {
        <div>
          <h2>{one.name}</h2>
        </div>
      })}

    </div>
  );

然后改为

 return (
    <div >
      {updated.map((one,index) => {
        return (
          <div key={index}>
          <h2>{one.name}</h2>
          </div>
        )
      })}

    </div>
  );

问题是在map函数之后没有返回语句


这个问题是因为您试图显示整个对象,而不是对象内部的键。

例如:数据是

[
    {
        "status": "success",
        "count": 20511
    },
    {
        "status": "failure",
        "count": 1776
    }
]

现在,在如下所示的组件中,这将工作。

import React, { Component } from 'react';


export default class Display extends Component {

    render() {

        const { data } = this.props;

        return (
            <>
           
               {
                   data.map((value,key)=>
                       <div>{value.status}</div>
                       <div>{value.count}</div>
                   )
               }
            </>

        )
    }
}

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

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

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

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

应该可以这样工作。


我也有同样的问题,然后我意识到我犯了有史以来最愚蠢的错误。我让我的组件是异步的,我的意思是我使用了async关键字,就像这样

const ComponentName = async () => {
  return <>
   <div>This a WRONG component</div>
 </>
}

然后,在经历了很多头疼和祈祷之后,我意识到我的愚蠢错误,并删除了async。

const ComponentName = () => {
  return <>
   <div>This a WRONG component</div>
 </>
}

我使用faker.js我期待公司字段是字符串,但它是一个数组 它是:

<div className='text-gray-400 text-sm'>works at {s.company}</div>

而应该是

<div className='text-gray-400 text-sm'>works at {s.company.name}</div>

我认为这不是程序员的错,世界是一个意想不到的地方,它的数据可能是任何东西。React应该指出准确的错误。


就我而言,我做到了

<IonListHeader>
  <IonLabel>
     Order {{index}}
  </IonLabel>
</IonListHeader>

而不是

<IonListHeader>
  <IonLabel>
     Order {index}
  </IonLabel>
</IonListHeader>

双花括号。


我有一个类似的问题,我忘记在接受组件中的参数时添加花括号{}。

我有这个:const ServiceCard =(颜色,标题,图标,subtitle) => (

然后我将其更新为:const ServiceCard =({颜色,标题,图标,subtitle}) => (

这招奏效了。


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

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