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

React-Bootstrap Modal关闭按钮失效:类组件状态修复咨询

修复React-Bootstrap Modal无法关闭的问题

我帮你定位到了问题的核心:你在类组件的状态里错误地加入了冗余的setShow字段,并且关闭Modal时更新的是这个无关字段,而非控制Modal显示的show状态。下面是一步步的修复方案:

1. 清理冗余状态字段

类组件不需要像函数组件那样单独维护setState对应的setter变量,把state里的setShow删掉,只保留控制Modal显示的show字段:

state = {
  whichComponentToShow: "FeatureCard",
  show: false, // 仅保留这个控制Modal显示的状态
};

2. 修正状态更新逻辑

将handleClose和handleShow方法里的状态更新目标改为show,而不是错误的setShow:

handleClose = () => {
  // 更新show为false,关闭Modal
  this.setState({ show: false });
};

handleShow = () => {
  // 更新show为true,打开Modal
  this.setState({ show: true });
};

3. 确保Modal的状态绑定正确

你的Modal组件已经正确绑定了show={this.state.show}和onHide={this.handleClose},这部分无需修改,但要确保所有关闭触发点(包括Modal头部的关闭按钮和底部的Close按钮)都正确调用了handleClose,你当前的代码这部分是没问题的。

可选:优化组件切换逻辑(更简洁)

其实你不需要用whichComponentToShow来切换显示FeatureCard还是Modal,直接通过show状态控制Modal的显示/隐藏即可,点击FeatureCard时调用handleShow打开Modal,这样逻辑更清晰:

render() {
  return (
    <div className="Shirts" style={{ margin: "3rem 0rem" }}>
      <div>
        <AllDressHeader 
          Image={ShirtHeader} 
          h1="SHIRTS FOR MEN" 
          para="Id adipisicing elit adipisicing Lorem. Laborum deserunt laboris ex aliqua deserunt ipsum irure culpa pariatur in esseRegular box》 esse To(Man.A(LR and.input�素)
          h2="CHOOSE YOUR FAVOURITE SHIRT NOW" 
        />
      </div>
      <Container>
        <Row>
          <Col>
            <FeatureCard 
              OnClick={this.handleShow} 
              image={img} 
              title="Sky Blue" 
              price="9$" 
            />
          </Col>
          <Col>
            <FeatureCard image={img2} title="Beach Light" price="25.50$" />
          </Col>
          <Col>
            <FeatureCard image={img3} title="Official Formal" price="9.99$" />
          </Col>
          <Col>
            <FeatureCard image={img4} title="Denim" price="19$" />
          </Col>
        </Row>
        <Row>
          {/* 其他FeatureCard代码保持不变 */}
          <Col>
            <FeatureCard image={img5} title="Red Black" price="12$" />
          </Col>
          <Col>
            <FeatureCard image={img6} title="Blue White Denim" price="56$" />
          </Col>
          <Col>
            <FeatureCard image={img7} title="White Long Sleeve" price="8$" />
          </Col>
          <Col>
            <FeatureCard image={img8} title="Blue Dotted" price="9.50$" />
          </Col>
        </Row>
      </Container>

      {/* 直接把Modal放在render中,通过show状态控制显示 */}
      <Modal show={this.state.show} onHide={this.handleClose} centered size="xl">
        <Modal.Header closeButton></Modal.Header>
        <Modal.Body>
          <Container fluid>
            <Row>
              <Col lg={12}>
                <ProductCard image={shirts} title="Sky Blue" price="9$" add="shirt" />
              </Col>
            </Row>
          </Container>
        </Modal.Body>
        <Modal.Footer>
          <Button variant="secondary" onClick={this.handleClose}>
            Close
          </Button>
        </Modal.Footer>
      </Modal>
    </div>
  );
}

完成以上修改后,点击关闭按钮时,Modal就能正常关闭了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:32:31