【问题标题】:Error when overriding props in React.cloneElement()在 React.cloneElement() 中覆盖道具时出错
【发布时间】:2016-03-05 01:38:18
【问题描述】:

我是 ReactJS 的新手,最近正在尝试开发一个侧边栏组件。 我有两个反应组件(SidebarNavSidebarNavItem),它们可以相互嵌套以显示结构化的侧边栏菜单。

侧边栏导航

import React, {Component, PropTypes} from 'react';

export default class SidebarNav extends Component {

    static propTypes = {
        level: PropTypes.number,
        children: React.PropTypes.oneOfType([
            React.PropTypes.object,
            PropTypes.arrayOf(PropTypes.object)
        ])
    };

    render() {

        const {level, children} = this.props;

        const currentLevel = !level ? 1 : level;

        let navClass;
        switch (currentLevel) {
            case 1:
                navClass = 'tfmenu';
                break;
            case 2:
                navClass = 'nav-second-level collpase in';
                break;
            default:
                navClass = 'nav-third-level collpase in';
        }

        return (
            <ul className={'nav ' + navClass}>
                {React.Children.map(children, element => {
                    return React.cloneElement(element, {level: currentLevel});
                })}
            </ul>
        );
    }
}

SidebarNavItem

import React, {Component, PropTypes} from 'react';

export default class SidebarNavItem extends Component {

    static propTypes = {
        title: PropTypes.string.isRequired,
        href: PropTypes.string.isRequired,
        iconClass: PropTypes.string,
        level: PropTypes.number,
        children: PropTypes.object
    };

    render() {

        const {title, href, iconClass, level, children} = this.props;

        return (
            <li>
                <a href={href}>
                    {iconClass && level === 1 && <i className={'fa ' + iconClass}></i>}

                    {level === 1 ? <span className="nav-label">{title}</span> : {title}}

                    {level === 2 && children && <span className="fa arrow"></span>}

                    {'level: ' + level}
                </a>

                {children && React.cloneElement(children, {level: level + 1})}
            </li>
        );
    }
}

问题似乎存在于以下行:

{children && React.cloneElement(children, {level: level + 1})}

我想在这里解释一下。 level 属性用于区分侧边栏项目的放置深度,以便可以应用不同的样式。当我尝试使用以下代码测试组件时。

<SidebarNav>
  <SidebarNavItem href="/portal" title="Portal" iconClass="fa-home">
    <SidebarNav>
      <SidebarNavItem href="/portal/home1" title="Home1" />
      <SidebarNavItem href="/portal/home2" title="Home2" />
    </SidebarNav>
  </SidebarNavItem>
  <SidebarNavItem href="/signin" title="Signin" iconClass="fa-home" />
</SidebarNav>

我收到以下错误。

Invariant Violation:对象作为 React 子对象无效(发现: 带有键 {title} 的对象)。如果你打算渲染一个集合 孩子,使用数组代替或使用包装对象 来自 React 附加组件的 createFragment(object)。检查渲染方法 SidebarNavItem.

有人知道我的代码出了什么问题吗?非常感谢。

【问题讨论】:

    标签: javascript reactjs overriding


    【解决方案1】:

    这行错误{level === 1 ? &lt;span className="nav-label"&gt;{title}&lt;/span&gt; : {title}}。它必须是反应元素(或原始值)而不是{title}

    【讨论】:

      【解决方案2】:

      您的代码存在语法问题,{ } 用于变量或函数

      你可以:

      generate(){
          return (<span>something</span>);
      }
      
      render(){
          var abc = (<span>something</span>);
          return (
              <div>
              {abc}
              {this.generate()}
              {abc || this.generate()} 
              </div>
          );
      }
      

      您可能想看看 react router 中的这些示例,以了解它们如何实际实现导航侧栏。特别是侧边栏示例。

      react examples

      【讨论】:

      • 感谢您的帮助。这个例子真的很有帮助。
      • 其实你也可以使用 { } 作为原始值:{ 'string value' } or { 1 }等... { } 用于插值
      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多