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

解决React项目页Modal弹窗无法关闭的问题

问题分析与解决方案

问题根源

问题出在事件冒泡上:你的CrowdfundingModal组件被嵌套在带有onClick={() => setCrowdfundingIsOpen(true)}的img-card-container容器内。当你点击Modal的背景或关闭按钮时,触发setCrowdfundingIsOpen(false)后,事件会向上冒泡到父容器img-card-container,触发它的点击事件又将状态重新设为true,所以看起来Modal无法关闭。

解决方案

有两种可行的修复方式:

方式一:阻止事件冒泡

在Modal的点击事件中添加e.stopPropagation(),阻止事件向上传递到父容器:

const CrowdfundingModal = ({ setCrowdfundingIsOpen }) => {
  const handleClose = (e) => {
    e.stopPropagation(); // 阻止事件冒泡
    setCrowdfundingIsOpen(false);
  };

  return (
    <div className={styles.darkBG} onClick={handleClose}>
      <div className={styles.centered}>
        <div className="projects-model-body">
          <i
            className={styles.closeBtn}
            onClick={handleClose}
          >
            <FaTimes style={{ marginBottom: "-3px" }} />
          </i>
          <div> Modal Body goes here</div>
        </div>
      </div>
    </div>
  );
};

方式二:将Modal移出父容器

更合理的做法是把Modal组件从img-card-container中移出,放在组件的根层级(比如和所有卡片容器同级),避免嵌套在触发它的元素内:

// 项目页面代码修改
...
const [crowdfundingIsOpen, setCrowdfundingIsOpen] = useState(false);
...

return (
  <>
    <div className="img-card-container" onClick={() => setCrowdfundingIsOpen(true)}>
      <div className="img-card">
        <div className="overlay"></div>
        <div className="info">
          <h3>Crowd Funding</h3>
          <span>Personal</span>
        </div>
        <img src={projectPreview} alt="" />
      </div>
    </div>
    {/* 将Modal移到父容器外面 */}
    {crowdfundingIsOpen && (
      <CrowdfundingModal setCrowdfundingIsOpen={setCrowdfundingIsOpen} />
    )}
  </>
);

为什么服务页正常?

推测服务页的Modal没有嵌套在触发它的点击容器内,而是放在了全局层级,所以不会出现事件冒泡冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:33:28