React-Bootstrap 多模态
React-Bootstrap Multiple Modal
我在我的项目中使用 React-bootstrap。
我需要打开多个对话框。
有什么办法可以实现吗?
注意:
bootstrap here 有答案,但它在 react-bootstrap 中不起作用。
谢谢
这取决于你想达到什么目的。我有多个反应 bootstrap 模态对话框,也有嵌入式对话框,例如模态对话框显示带有错误消息的弹出窗口。
通常你可以定义状态变量,像这样:
this.state = {showModal1:true, showModal2:false,...}
在你的渲染函数中你可以这样做:
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>
);
}
在上面的代码中,如果 showModal1 和 showModal2 都为真,您将获得两个模态对话框,第二个将在第一个上方。
我使用了多个这样的模型
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>
);
}
我们只是通过让每个传递不同的 id 然后将 'show' 状态设置为那个来处理多个模态:
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 ...
如果您使用的是 React 16.8+,则可以使用 React Hook useState
(和功能组件),这样您就可以根据状态指定希望它显示的模式:
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>
)
}
如果您使用 scss 作为 css 预处理器,那么您可以使用循环来定义正确的 z-index
以使所有内容都显示为其他.
此循环最多处理 5 个级别,您可以根据需要增加数量
@for $i from 1 through 6 {
$zIndexBackdrop: #{1000 + (5 * $i)};
$zIndexContent: #{1000 + (5 * $i) + 2};
.modal-backdrop.show:nth-of-type(#{$i}) {
z-index: $zIndexBackdrop;
}
div[role="dialog"][aria-modal="true"]:nth-of-type(#{$i}) {
z-index: $zIndexContent;
}
}
这里的循环1 through 6
循环了5次,如果你想增加模态的深度,可以增加次数。
我使用了 react-bootstrap
模态框使用的通用 class 名称,请交叉检查背景和主要模态框的创建方式。
“nth-of-type”解决方案对我不起作用。
相反,我用这样的“nth-last-child”解决了它。
div[role="dialog"][aria-modal="true"]:nth-last-child(1) {
z-index: 1125;
}
.modal-backdrop.show:nth-last-child(2){
z-index: 1100;
}
div[role="dialog"][aria-modal="true"]:nth-last-child(3) {
z-index: 1075;
}
.modal-backdrop.show:nth-last-child(4){
z-index: 1050;
}
div[role="dialog"][aria-modal="true"]:nth-last-child(5) {
z-index: 1025;
}
.modal-backdrop.show:nth-last-child(6){
z-index: 1000;
}
想法是,每次显示模态时,模态元素和阴影元素将附加到正文(库已经实现了)。所以从最后一个 child 开始,第 (n + 1) 个元素将是模态元素,第 (n + 2) 个元素将是模态阴影元素。
在示例中,我将嵌套模式设置为最多工作 3 个级别,但您可以根据需要添加其中两个样式。
我在我的项目中使用 React-bootstrap。 我需要打开多个对话框。 有什么办法可以实现吗?
注意: bootstrap here 有答案,但它在 react-bootstrap 中不起作用。 谢谢
这取决于你想达到什么目的。我有多个反应 bootstrap 模态对话框,也有嵌入式对话框,例如模态对话框显示带有错误消息的弹出窗口。 通常你可以定义状态变量,像这样:
this.state = {showModal1:true, showModal2:false,...}
在你的渲染函数中你可以这样做:
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>
);
}
在上面的代码中,如果 showModal1 和 showModal2 都为真,您将获得两个模态对话框,第二个将在第一个上方。
我使用了多个这样的模型
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>
);
}
我们只是通过让每个传递不同的 id 然后将 'show' 状态设置为那个来处理多个模态:
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 ...
如果您使用的是 React 16.8+,则可以使用 React Hook useState
(和功能组件),这样您就可以根据状态指定希望它显示的模式:
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>
)
}
如果您使用 scss 作为 css 预处理器,那么您可以使用循环来定义正确的 z-index
以使所有内容都显示为其他.
此循环最多处理 5 个级别,您可以根据需要增加数量
@for $i from 1 through 6 {
$zIndexBackdrop: #{1000 + (5 * $i)};
$zIndexContent: #{1000 + (5 * $i) + 2};
.modal-backdrop.show:nth-of-type(#{$i}) {
z-index: $zIndexBackdrop;
}
div[role="dialog"][aria-modal="true"]:nth-of-type(#{$i}) {
z-index: $zIndexContent;
}
}
这里的循环1 through 6
循环了5次,如果你想增加模态的深度,可以增加次数。
我使用了 react-bootstrap
模态框使用的通用 class 名称,请交叉检查背景和主要模态框的创建方式。
“nth-of-type”解决方案对我不起作用。 相反,我用这样的“nth-last-child”解决了它。
div[role="dialog"][aria-modal="true"]:nth-last-child(1) {
z-index: 1125;
}
.modal-backdrop.show:nth-last-child(2){
z-index: 1100;
}
div[role="dialog"][aria-modal="true"]:nth-last-child(3) {
z-index: 1075;
}
.modal-backdrop.show:nth-last-child(4){
z-index: 1050;
}
div[role="dialog"][aria-modal="true"]:nth-last-child(5) {
z-index: 1025;
}
.modal-backdrop.show:nth-last-child(6){
z-index: 1000;
}
想法是,每次显示模态时,模态元素和阴影元素将附加到正文(库已经实现了)。所以从最后一个 child 开始,第 (n + 1) 个元素将是模态元素,第 (n + 2) 个元素将是模态阴影元素。
在示例中,我将嵌套模式设置为最多工作 3 个级别,但您可以根据需要添加其中两个样式。