我仍然是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,但是文档并未确切说明我何时应该使用它。
那么,一个人做什么却另一个人不能做什么呢?有人可以用更好的例子向我解释吗?
其实
React.cloneElement
并没有严格的关联this.props.children
。每当您需要克隆react elements(
PropTypes.element
)以添加/覆盖prop而不希望父级不了解有关这些组件内部的知识(例如,附加事件处理程序或分配key
/ref
属性)时,此方法就很有用。反应元素也是不可变的。
但是,
children
React中的prop特别用于包含(也称为composition),与使用props的React.Children
API和React.cloneElement
组件配对。孩子可以在内部处理更多逻辑(例如状态转换,事件,DOM测量等),同时将渲染部分转换为无论在何处使用,React Router<switch/>
或复合组件<select/>
都是很好的例子。值得一提的最后一件事是,react元素不仅限于props.children。
它们可以是任何道具是有道理的,关键是要定义部件一份不错的合同,这样它的消费者可以从底层实现细节解耦,无论它的使用
React.Children
,React.cloneElement
或甚至React.createContext
。