我仍然是 React 的菜鸟,在互联网上的许多示例中,我看到了渲染子元素的这种变化,这让我感到困惑。通常我会看到这个:
class Users extends React.Component {
render() {
return (
<div>
<h2>Users</h2>
{this.props.children}
</div>
)
}
}
但后来我看到一个这样的例子:
<ReactCSSTransitionGroup
component="div"
transitionName="example"
transitionEnterTimeout={500}
transitionLeaveTimeout={500}
>
{React.cloneElement(this.props.children, {
key: this.props.location.pathname
})}
</ReactCSSTransitionGroup>
现在我了解了 api,但 文档 并没有明确说明我应该何时使用它。
那么一个人能做什么而另一个人不能呢?有人可以用更好的例子向我解释吗?
原文由 Amit Erandole 发布,翻译遵循 CC BY-SA 4.0 许可协议
props.children
不是真正的孩子;它是孩子的 _描述符_。所以你实际上没有什么要改变的;您不能更改任何道具,或编辑任何功能;你只能 _从中读取_。如果您需要进行任何修改,您必须使用React.CloneElement
创建 _新元素_。https://egghead.io/lessons/react-use-react-cloneelement-to-extend-functionality-of-children-components
一个例子:
组件的主要渲染功能,例如
App.js
:现在假设您需要为
onClick
Paragraph
;所以在你的Paragraph.js
你可以这样做:那么你可以这样做:
注意:
React.Children.map
函数只会看到 顶级 元素,它看不到这些元素呈现的任何东西;这意味着您正在向孩子提供直接道具(这里是<Sentence />
元素)。如果您需要进一步传递道具,假设您将在<Sentence />
元素之一中有一个<div></div>
想要使用onClick
然后在这种情况下,您可以使用 Context API 来执行此操作。将Paragraph
提供者和Sentence
元素作为消费者。