React:违反常态:对象作为React子对象无效

时间:2019-03-13 22:58:16

标签: javascript reactjs ecmascript-6

我正在使用ReactJS搜索过滤器,目前当我进入匹配输入应用程序时崩溃并给出此错误Objects are not valid as a React child (found: object with keys {id, companyName, account, venueCode, openDate, website, primaryPhone, emailAddress, description, firstName, lastName, active, title, department, officePhone, mobilePhone, tenantId, hidden, deleted, parentId}). If you meant to render a collection of children, use an array instead.时遇到一个问题,请有人帮我解决这个问题。我是初学者,没有太多知识解决这个问题。当我输入一些匹配输入时,第一次应用程序成功渲染,这给我一个错误。

代码

        class Example extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      Item: 5,
      skip: 0
    }

    this.handleClick = this.handleClick.bind(this);
  }

  urlParams() {
    return `http://localhost:3001/meetups?filter[limit]=${(this.state.Item)}&&filter[skip]=${this.state.skip}`
  }

  handleClick() {
    this.setState({skip: this.state.skip + 1})
  }

  render() {
    return (
      <div>
        <a href={this.urlParams()}>Example link</a>
        <pre>{this.urlParams()}</pre>
        <button onClick={this.handleClick}>Change link</button>
      </div>
    )
  }
}


ReactDOM.render(<Example/>, document.querySelector('div#my-example' ))

5 个答案:

答案 0 :(得分:3)

当您尝试渲染对象而不是JSX时,会发生这种情况。做出我最有学问的猜测,我认为这是问题所在:

let filtered=this.state.data.filter((item)=>{
      return item.companyName.indexOf(keyword) > -1
    });

已过滤似乎是对象数组,而不是JSX,因此在render方法中:

{this.state.filtered.length === 0 ? dataRender : this.state.filtered}

可能尝试渲染过滤的对象,而不是JSX。

要解决此问题,请尝试添加此内容:

const filterRender=this.state.filtered.map((dataItem)=>(
  <Table.Row key={dataItem.id}>
  <Table.Cell>{dataItem.companyName}</Table.Cell>
  <Table.Cell>{dataItem.primaryPhone}</Table.Cell>
  <Table.Cell>{dataItem.emailAddress}</Table.Cell>
  <Table.Cell>{dataItem.venueCode}</Table.Cell>
  <Table.Cell>{dataItem.account}</Table.Cell>
  <Table.Cell>{dataItem.openDate}</Table.Cell>
  <Table.Cell>{dataItem.website}</Table.Cell>
  <Table.Cell>{dataItem.description}</Table.Cell>
</Table.Row>
))

并将其更改为:

{this.state.filtered.length === 0 ? dataRender : filterRender}

正如@jsdeveloper在下面指出的那样,最好使用renderRow方法来处理此问题。

答案 1 :(得分:2)

我要添加到睡眠中的答案的唯一一件事就是您应该创建一个映射到数据项的函数:

getDataItems(data) {
    return data.map((dataItem)=>(
      <Table.Row key={dataItem.id}>
      <Table.Cell>{dataItem.companyName}</Table.Cell>
      <Table.Cell>{dataItem.primaryPhone}</Table.Cell>
      <Table.Cell>{dataItem.emailAddress}</Table.Cell>
      <Table.Cell>{dataItem.venueCode}</Table.Cell>
      <Table.Cell>{dataItem.account}</Table.Cell>
      <Table.Cell>{dataItem.openDate}</Table.Cell>
      <Table.Cell>{dataItem.website}</Table.Cell>
      <Table.Cell>{dataItem.description}</Table.Cell>
    </Table.Row>
    ))
}
render() {
  const filteredItems = getDataItems(this.state.filtered)
  const dataItems = getDataItems(this.state.data)
  ...

答案 2 :(得分:1)

您应该添加一个状态道具,以处理组件准备就绪或必须渲染加载程序的情况。

这将解决以下问题:如果您的财产this.state.data已由您的getDataMethod填充。

因此,您应该尝试添加诸如以下内容的初始状态属性:

class Organization extends Component {
  constructor(props){
    super(props);
    this.state={
      Item : 5,
      skip:0,
      isReady: false,
      data : [],
      filtered:[]
    }
    this.getData=this.getData.bind(this);
    this.btnClick=this.btnClick.bind(this);
    this.prevButton=this.prevButton.bind(this);
  }

,您应该像这样处理getData中的isReady状态:

 getData(){
    const {Item,skip}=this.state;
    axios.get(`http://localhost:8001/parties?filter[limit]=${Item}&&filter[skip]=${skip}`)
    .then(response=>{
      console.log(response.data);
      this.setState({
        isReady: true,
        data:response.data
      })
    })
  }

并在您的render方法中添加一个条件:

render() {
    if( !this.state.isReady ){
      return <div>Loading...</div>
    }
    // return your JSX
    return ....
}

答案 3 :(得分:1)

我无法确定这一点,但是我希望dataRender const返回一系列不包含父项的行。正确的方法是创建一个<TableRow />组件,该组件在jsx的render函数中使用map函数,如下所示:

...
<Table.Body>
    {this.state.filtered.length === 0 ? 
    this.state.data.map((dataItem)=>(<TableRow key={dataItem.id} item={dataItem}/>)
    : this.state.filtered}
</Table.Body>
...

答案 4 :(得分:0)

我遇到了这个问题,这是一个非常简单的解决方案。我有一个嵌套在对象中的对象,然后尝试在JSX中显示该对象,而不是该对象的属性。该错误显示在该对象设置为状态的行,而不是从JSX中的状态调用该对象的行。

对象处于状态:

    test: { status: { id: 1, text: "value" } }

JSX(错误)

<div>{this.state.test.status}</div>

JSX(右)

<div>{this.state.test.status.text}</div>