我有一个为弹出窗口构建的React组件。 PopupContent
将作为子元素接收DOM元素或另一个React组件。
class PopupContent extends React.Component {
render() {
return(
<div>
{React.cloneElement(this.props.children, {closePopup:this.props.closePopup})}
</div>
);
}
}
closePopup
道具设置一个标志来显示/隐藏弹出窗口
closePopup(event){
event.preventDefault();
this.setState({
popupInView: false
})
}
将closePopup
传递给子级的原因是要关闭子级组件的弹出窗口。
如果子项是自定义的React组件,则此设置效果很好:
<PopupContent>
<ContentOfThePopup />
</PopupContent>
但是如果孩子是DOM元素,我会得到Unknown Prop Warning。
警告:React无法识别DOM上的
closePopup
道具 元素。
<PopupContent>
<div>Content Of The Popup </div>
</PopupContent>
我可以使用here中介绍的技术来区分DOM元素和React组件。但我想向社区咨询是否有更好的方法
答案 0 :(得分:1)
this.props.children
包含什么?
你不应该迭代吗?
render() {
return React
.Children
// this is the jsx version of cloneElenemnt,
// better to use in a render function
.map(Child => <Child.type ...Child.props ...this.props>)
}
答案 1 :(得分:0)
如果您尝试使用React无法识别为合法DOM属性/属性的道具来渲染DOM元素,则会触发unknown-prop警告。您应该确保DOM元素周围没有虚假的道具。
您应确保您不会意外转发原本由父组件解释的道具。
您还可以尝试使用{...this.props}
格式来传递数据,而不是使用cloneElement(element, this.props)
答案 2 :(得分:0)
我最终检查了孩子的类型并有条件地移除了道具closePopup
如果子元素是HTML DOM元素,则跟踪条件为true
。
typeof this.props.children.type === 'string