You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Bootstrap Modal可正常打开但无法关闭的问题如何解决?

问题原因

你遇到的问题是事件冒泡导致的:你将整个<Modal>组件嵌套在了绑定了onClick={this.openModal}的<div className='wbtn'>元素内部。当你点击模态框的关闭按钮、右上角关闭叉号、模态框外部遮罩层触发closeModal将showlogin设为false后,点击事件会向上冒泡到外层的<div className='wbtn'>,再次触发openModal将showlogin设回true,所以视觉上看起来模态框完全无法关闭。

解决方案

更推荐的优化方式是调整组件结构,将Modal从触发点击的div内部移出,放到无额外点击事件绑定的外层节点,修改后的render部分示例如下:

render() {
  return ( 
    <div>
      <Navbar bg='light' variant='light' >
        <div className='logo'>
          <Container >
            <NavbarBrand className='brandcolor'>
              <h1>ETHER<span>SHARE<i className="fab fa-ethereum"></i></span></h1>
            </NavbarBrand>
          </Container>
        </div>
        
        {/* 触发模态框的按钮容器,内部不再嵌套Modal */}
        <div className='wbtn' onClick={this.openModal}>
          <h3><i className="fas fa-exclamation-triangle"></i>Connect|Login<i className='fas fa-exchange-alt'></i></h3>
        </div>
     
        <Container>
          <InputGroup className="mb-3">
              <InputGroup.Text id="basic-addon1"><i className="fas fa-user-plus" aria-hidden="true"></i></InputGroup.Text>
                  <FormControl
                      placeholder="@username (search)"
                      aria-label="Username"
                      aria-describedby="basic-addon1"
                        />
            </InputGroup>
        </Container>
        <Container >
          <Nav >
              <ul className='menuItems'>
              <div className='mainmenu'>
                <Nav.Link className='linkitem'>
                   <li onClick={this.homepage}> 
                    <i className="fa fa-home" aria-hidden="true"></i>
                    Home
                    <div className='arrow'>
                      <i className="fa fa-angle-double-right" ></i>
                    </div>
                  </li>
                </Nav.Link>
                <Nav.Link className='linkitem'>
                  <li onClick={this.accountpage}>
                    <i className="fa fa-cog" aria-hidden="true"></i>
                    Account
                    <div className='arrow'>
                      <i className="fa fa-angle-right"></i>
                    </div>
                  </li>
                </Nav.Link>
                <Nav.Link className='linkitem'>
                  <li onClick={this.poolpage}>
                    <i className="fa fa-rocket" aria-hidden="true"></i>
                        Pool
                        <div className='arrow'>
                      <i className="fa fa-angle-right"></i>
                        </div>
                    </li>  
                  </Nav.Link>
                  <Nav.Link className='linkitem'>
                  <li onClick={this.loanpage}>
                    <i className="fa fa-university" aria-hidden="true"></i>
                      Loan|Borrow
                      <div className='arrow'>
                      <i className="fa fa-angle-right"></i>
                    </div>
                  </li>
                </Nav.Link>
                <Nav.Link className='linkitem'>
                  <li onClick={this.adpage}>
                    <i className="fa fa-plus" aria-hidden="true"></i>
                      Ads(earn crypto)
                      <div className='arrow'>
                      <i className="fa fa-angle-right"></i>
                    </div>
                  </li>
                </Nav.Link>
                <Nav.Link className='linkitem'>
                  <li onClick={this.statspage}>
                    <i className="fa fa-signal" aria-hidden="true"></i>
                      Stats
                      <div className='arrow'>
                      <i className="fa fa-angle-right"></i>
                    </div>
                  </li>
                </Nav.Link>
                </div>  
              </ul>
          </Nav>
        </Container>
        <div className='footy'>
        <Foot />
        </div>
      </Navbar> 
      {/* Modal移到外层,避免触发父元素的openModal */}
      <Modal show={this.state.showlogin} onHide={this.closeModal} size='lg' centered>
        <Modal.Header closeButton>
          <Modal.Title className='cent'>
            <ButtonGroup size="sm" className="mb-2">
            <Button variant='dark'>Login</Button>
            <Button variant='dark'>Register</Button>
          </ButtonGroup>
          </Modal.Title>
        </Modal.Header>
        <Modal.Body>Woohoo, you're reading this text in a modal!</Modal.Body>
        <Modal.Footer>
            <Button variant="secondary" onClick={this.closeModal}>
                  Close
            </Button>
            <Button variant="primary" onClick={this.closeModal}>
                Save Changes
            </Button>
        </Modal.Footer>
      </Modal>
      {this.state.content}
    </div>
  )
}

如果你不想调整结构,也可以直接给Modal组件添加点击事件阻止冒泡:

<Modal 
  show={this.state.showlogin} 
  onHide={this.closeModal} 
  size='lg' 
  centered
  onClick={e => e.stopPropagation()}
>

调整后即可正常关闭模态框。

内容的提问来源于stack exchange,提问作者thomas305

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:36:04