Ответ 1
То, что вы ищете, - это настраиваемый модальный триггер, который использует OverlayMixin
и позволяет вам управлять модальным состоянием самостоятельно. Вы можете контролировать, отображается ли модальное значение с помощью this.setState({isModalOpen: true})
, чтобы достичь эквивалента того, что вы просили в своем сообщении в приведенном ниже примере. Следующий код находится на сайте реакции-бутстрапа (http://react-bootstrap.github.io/components.html#modals):
const CustomModalTrigger = React.createClass({
mixins: [OverlayMixin],
getInitialState() {
return {
isModalOpen: false
};
},
handleToggle() {
this.setState({
isModalOpen: !this.state.isModalOpen
});
},
render() {
return (
<Button onClick={this.handleToggle} bsStyle='primary'>Launch</Button>
);
},
// This is called by the `OverlayMixin` when this component
// is mounted or updated and the return value is appended to the body.
renderOverlay() {
if (!this.state.isModalOpen) {
return <span/>;
}
return (
<Modal bsStyle='primary' title='Modal heading' onRequestHide={this.handleToggle}>
<div className='modal-body'>
This modal is controlled by our custom trigger component.
</div>
<div className='modal-footer'>
<Button onClick={this.handleToggle}>Close</Button>
</div>
</Modal>
);
}
});
React.render(<CustomModalTrigger />, mountNode);
ОБНОВЛЕНИЕ (4 августа 2015 г.)
В новейшей версии React-Bootstrap, независимо от того, показан ли модальный или нет, управляется show
prop, который передается модальному. OverlayMixin
больше не требуется для управления модальным состоянием. Управление состоянием модальности все еще выполняется через setState
, в этом примере через this.setState({ showModal: true })
. Ниже приведен пример, приведенный на веб-сайте React-Bootstrap:
const ControlledModalExample = React.createClass({
getInitialState(){
return { showModal: false };
},
close(){
this.setState({ showModal: false });
},
open(){
this.setState({ showModal: true });
},
render() {
return (
<div>
<Button onClick={this.open}>
Launch modal
</Button>
<Modal show={this.state.showModal} onHide={this.close}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>
<div>Modal content here </div>
</Modal.Body>
<Modal.Footer>
<Button onClick={this.close}>Close</Button>
</Modal.Footer>
</Modal>
</div>
);
}
});