问题
I am using React-bootstrap in my project. I need to open multiple dialog. Is there any way to achieve this?
Note: There is answers for bootstrap here but it does not work in react-bootstrap. Thanks.
回答1:
we just handled multiple modals by having each pass in a different id and then setting the 'show' state to that:
https://github.com/AgileVentures/agile-ventures-website-react-front-end/blob/4_homepage_changes_mob/src/App.js#L26
class App extends Component {
constructor(props, context) {
super(props, context);
this.handleShow = this.handleShow.bind(this);
this.handleClose = this.handleClose.bind(this);
this.state = {
show: null
};
}
handleClose() {
this.setState({show: id});
}
handleShow(id) {
this.setState({show: id});
}
render() {
return (
<div className="App">
<Grid>
<Row>
<Col xsOffset={1} sm={5}>
<Button bsStyle="primary" bsSize="large" onClick={() => this.handleShow('here')}>
<h1>You are here!</h1>
</Button>
<Modal
show={this.state.show == 'here'} onHide={this.handleClose}
>
<Modal.Header closeButton closeLabel="close window">
</Modal.Header>
<Modal.Body>
<p className='landing-page-markers you-are-here'>Tired of toy projects, tutorials and online courses?
<img src={logo} className="App-logo" alt="logo" />
</p>
</Modal.Body>
</Modal>
</Col>
</Row>
... more modals passing in different ids ...
回答2:
i used multiple models like this
render() {
return(
<div>
<button onClick={() => this.setState({ showModal1:true, showModal2:false});} >open modal one</button>
<button onClick={() => this.setState({ showModal2:true, showModal1:false});} >open modal two</button>
<Modal show={this.state.showModal1} onHide={() => this.setState({ showModal1:false});}>
modal one content..
</Modal>
<Modal show={this.state.showModal2} onHide={() => this.setState({ showModal2:false});}>
modal two content..
</Modal>
</div>
);
}
回答3:
It depends on what do you want to achieve. I have multiple react bootstrap modal dialogs and also have embedded dialogs, like modal dialog shows popup with error message. Generally you can define state variable, like this:
this.state = {showModal1:true, showModal2:false,...}
In your render function you can do like this:
render() {
return(
<div>
<Modal show={this.state.showModal1}>
some modal 1 text comes here
</Modal>
<Modal show={this.state.showModal2}>
some modal 2 text comes here
</Modal>
</div>
);
}
In the code above, if both showModal1 and showModal2 are true, you will get both modal dialogs and the second will above the first one.
回答4:
If you are using React 16.8+, you can use the React Hook useState
(and functional component) so you can specify which modals you want it to appear based on the state:
export const MyModals = () => {
const [modalState, setModalState] = useState< "modal-one" | "modal-two" | "close" >("close")
const handleShowModalOne = () => {
setModalState("modal-one")
}
const handleShowModalTwo = () => {
setModalState("modal-two")
}
const handleClose = () => {
setModalState("close")
}
return (
<div>
<Button onClick={handleShowModalOne}>Show Modal One</Button>
<Modal show={modalState === "modal-one"}>
<Modal.Body>This is Modal One</Modal.Body>
<Modal.Footer>
<Button onClick={handleShowModalTwo}>Show Modal Two</Button>
</Modal.Footer>
</Modal>
<Modal show={modalState === "modal-two"}>
<Modal.Body>This is Modal Two</Modal.Body>
<Modal.Footer>
<Button onClick={handleClose}>Close</Button>
</Modal.Footer>
</Modal>
</div>
)
}
来源:https://stackoverflow.com/questions/35060594/react-bootstrap-multiple-modal