你可以使用
React.cloneElement
,在你开始在你的应用中使用它之前最好了解它的工作原理。它是在
React v0.13
中引入的,继续阅读以获取更多信息,所以这个工作对你来说可能会有所帮助:
<div>{React.cloneElement(this.props.children, {...this.props})}</div>
所以,我为你带来了React文档中的一些代码,让你了解它们是如何工作的,以及如何使用它们:
在React v0.13 RC2中,我们将引入一个新的API,类似于React.addons.cloneWithProps,具有以下签名:
React.cloneElement(element, props, ...children);
与cloneWithProps不同,这个新函数没有任何魔法内置行为来合并样式和类名,原因与transferPropsTo没有该功能相同。没有人确定魔法事物的完整列表,这使得对代码的推理和在样式具有不同签名时的重用变得困难(例如在即将到来的React Native中)。React.cloneElement几乎等同于:
<element.type {...element.props} {...props}>{children}</element.type>
然而,与JSX和cloneWithProps不同的是,它还保留了引用。这意味着,如果你获取一个带有引用的子元素,你不会意外地从祖先那里偷走它。你将获得相同的引用附加到你的新元素上。
一个常见的模式是遍历你的子元素并添加一个新的属性。关于cloneWithProps丢失引用的问题报告了很多,这使得你的代码更难理解。现在,使用cloneElement遵循相同的模式将按预期工作。例如:
var newChildren = React.Children.map(this.props.children, function(child) {
return React.cloneElement(child, { foo: true })
});
注意:React.cloneElement(child, { ref: 'newRef' })会覆盖ref,因此两个父组件无法引用同一个子组件,除非使用回调引用。
这是一个重要的功能,需要在React 0.13中实现,因为props现在是不可变的。升级路径通常是克隆元素,但这样做可能会丢失ref。因此,我们需要一个更好的升级路径。在Facebook的升级过程中,我们意识到我们需要这个方法。我们从社区得到了同样的反馈。因此,我们决定在最终发布之前再发布一个RC,以确保我们能够实现这个功能。
我们计划最终废弃React.addons.cloneWithProps。目前我们还没有这样做,但这是一个很好的机会来开始考虑你自己的使用情况,并考虑使用React.cloneElement代替。在我们真正删除它之前,我们将确保在发布中包含废弃通知,因此不需要立即采取行动。
更多
这里...
React.Children.map()
迭代子元素。详情请参见 如何将属性传递给{react.children}。 - Victor Ofoegbu