在 React.cloneElement() 中重写道具时出错
Error when overriding props in React.cloneElement()
我是 ReactJS 的新手,最近正在尝试开发一个侧边栏组件。
我有两个 React 组件(SidebarNav 和 SidebarNavItem),它们可以相互嵌套以显示结构化侧边栏菜单。
侧边栏导航
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: Objects are not valid as a React child (found:
object with keys {title}). If you meant to render a collection of
children, use an array instead or wrap the object using
createFragment(object) from the React add-ons. Check the render method
of SidebarNavItem
.
有人知道我的代码出了什么问题吗?非常感谢。
这一行有错误 {level === 1 ? <span className="nav-label">{title}</span> : {title}}
。它必须是反应元素(或原始值)而不是 {title}
您的代码存在一些语法问题,{ } 用于变量或函数
您可以:
generate(){
return (<span>something</span>);
}
render(){
var abc = (<span>something</span>);
return (
<div>
{abc}
{this.generate()}
{abc || this.generate()}
</div>
);
}
您可能想看看 React Router 中的那些示例,看看它们是如何实际实现导航侧边栏的。特别是边栏示例。
我是 ReactJS 的新手,最近正在尝试开发一个侧边栏组件。 我有两个 React 组件(SidebarNav 和 SidebarNavItem),它们可以相互嵌套以显示结构化侧边栏菜单。
侧边栏导航
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: Objects are not valid as a React child (found: object with keys {title}). If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons. Check the render method of
SidebarNavItem
.
有人知道我的代码出了什么问题吗?非常感谢。
这一行有错误 {level === 1 ? <span className="nav-label">{title}</span> : {title}}
。它必须是反应元素(或原始值)而不是 {title}
您的代码存在一些语法问题,{ } 用于变量或函数
您可以:
generate(){
return (<span>something</span>);
}
render(){
var abc = (<span>something</span>);
return (
<div>
{abc}
{this.generate()}
{abc || this.generate()}
</div>
);
}
您可能想看看 React Router 中的那些示例,看看它们是如何实际实现导航侧边栏的。特别是边栏示例。