我遇到了所需PropTypes
投掷错误的问题。如果直接呈现PropType
,我希望Component
抛出错误。以下是我想要实现的一小部分样本。
您会注意到Button
道具有所需的PropType
句柄点击。
但我希望Modal
的实现尽可能简单。
由于我没有Modal的上下文,因此我无法将handleClick
方法直接绑定到Button
,因此我将Button
作为子项传递给我,并映射到子项上子组件的handleClick
方法。除了抛出Button
的错误之外,这非常有效,因为<Button>
在真正被渲染之前被调用和检查。
我尝试使用其他一些方法来使用高阶组件也可以。但是实现看起来很复杂而且乏味,这似乎是一种在需要时生成Modal
的简单方法。你不需要在子组件中传递任何道具,它会添加点击处理程序。
绕过proptypes检查直到它实际呈现在Modal
组件中,或者可能有更简单的方法,欢迎所有反馈,这将是非常棒的。
https://jsfiddle.net/kriscoulson/00xLw0up/1/
var Button = (props) =>
<button onClick={props.handleClick}>
{props.children}
</button>
Button.propTypes = {
handleClick: React.PropTypes.func.isRequired
}
class Modal extends React.Component {
openModal () {
console.log('Opening Modal.....')
}
childrenWithProps () {
return React.Children.map(this.props.children,(child) => React.cloneElement(child, {
handleClick: this.openModal
})
);
}
render () {
return (
<div>
{this.childrenWithProps()}
</div>
);
}
}
var App = () =>
<Modal>
<Button>Launch Modal</Button>
</Modal>
ReactDOM.render(
<App/>,
document.getElementById('container')
);
&#13;
<script src="https://facebook.github.io/react/js/jsfiddle-integration-babel.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
&#13;