【问题标题】:React render error反应渲染错误
【发布时间】:2018-08-24 04:51:17
【问题描述】:

我在尝试渲染嵌套导航时收到此错误:

对象作为 React 子级无效(找到:带有键 {id, name} 的对象)。如果您打算渲染一组子项,请改用数组。

我不确定如何正确渲染我的映射导航。任何帮助将不胜感激。

let items = [
  { id: 0, name: 'Products', items: [{ id: 2, name: 'M-PET.NET' }, { id: 3, name: 'M-PET.WEB' }]},
  { id: 4, name: 'Services', items: [{ id: 5, name: 'M-PET Hosted' }, { id: 6, name: 'Custom Programming' }]},
  { id: 7, name: 'TurnKey', items: [{ id: 8, name: 'About' }, { id: 9, name: 'Project Management' }, { id: 10, name: 'IT Tasks' }, { id: 11, name: 'Maintenance' }]},
  { id: 12, name: 'Key Industries', items: [{ id: 13, name: 'Transportation' }, { id: 14, name: 'Hospitality' }]},
  { id: 15, name: 'Company', items: ['Team', 'History']},
]

class Nav extends Component {
  render() {
    let nav = items.map((item) => <li node={item} children={item.items} key={item.id}></li>)
    console.log(nav)
    return (
      <div>
        <ul className='nav'>
          {nav}
        </ul>
      </div>
    )
  }
}

export default Nav

【问题讨论】:

    标签: javascript reactjs rendering


    【解决方案1】:

    items置于状态

    state = {
     items : [...] //array
    }
    

    然后将其映射为

    let nav = this.state.items...
    

    或者,如果您没有将其置于状态,您可以使用context 访问它

    let nav = this.items...
    

    这里要注意的一点是在同一个类中使用items,在你的情况下是Nav,方法是导入源或在同一个类中定义它。

    class Nav extends Component {
    
     let items = [...];
     ...
     render(){
      let nav = this.items...
     }
    }
    

    class Nav extends Component {
    
     state = { items:[...] };
     ...
     render(){
      let nav = this.state.items...
     }
    }
    

    【讨论】:

      【解决方案2】:

      您在这行代码中有错误:

      <li node={item} children={item.items} key={item.id}>
      // passed as object ^^ (item.items)
      

      因此,删除它会正常工作。你会像这样用它做什么:

      <li node={item} key={item.id}>{renderListItems(item.items)}</li>
      

      现在,您有了不同的 renderListItems 组件,您可以在其中映射以遍历子组件:

      renderListItems = (items) => {
           return items.map(item => (
             <p key={`don't-forget-the-key-to-unique`}>{item.name}</p>
           ))
         }
      

      【讨论】:

        【解决方案3】:

        你不能只返回一个对象数组,因为没有任何东西告诉 React 如何渲染它。您需要返回一个组件或元素数组,例如:

        let nav = items.map((item) =>
          <li
            node={item}
            children={item.items.map(x => x.name)}
            key={item.id}>
          </li>)
        

        【讨论】:

        • 这会给你警告唯一键。因此,正确的解决方案是使用子元素而不是子元素作为属性。
        猜你喜欢
        • 1970-01-01
        • 2018-12-26
        • 2021-04-28
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 2020-05-19
        • 1970-01-01
        相关资源
        最近更新 更多