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

React中如何实现仅点击Backdrop遮罩层时关闭模态框?

解决React模态框点击子组件触发关闭的问题

这是因为React的事件冒泡机制,点击子组件ModalContainer时,事件会向上冒泡到父组件Backdrop,从而触发关闭函数。可以通过以下两种方法解决:

方法一:阻止子组件的事件冒泡

在ModalContainer上添加onClick事件,调用e.stopPropagation()阻止事件向上传递:

const Backdrop = styled.div`
display: flex;
align-items: center;
justify-content: center;
position: absolute;
top:0;
left: 0;
background-color: rgba(0,0,0,0.7);
width: 100vw;
height: 100vh;
`

const ModalContainer = styled.div`
position: relative;
width: 700px;
height: 600px;
background-color: lightcoral;
`;

const [modalbool, setModalbool] = useState(false);

const modalClosefunc = () => {
  setModalbool(false);
};

{modalbool ? (
  <Backdrop onClick={modalClosefunc}>
    <ModalContainer onClick={(e) => e.stopPropagation()}>
      {/* 模态框内容 */}
    </ModalContainer>
  </Backdrop>
) : null}

方法二:在父组件点击事件中判断触发元素

修改Backdrop的点击事件,只有当点击的元素是Backdrop本身时,才执行关闭逻辑:

const Backdrop = styled.div`
display: flex;
align-items: center;
justify-content: center;
position: absolute;
top:0;
left: 0;
background-color: rgba(0,0,0,0.7);
width: 100vw;
height: 100vh;
`

const ModalContainer = styled.div`
position: relative;
width: 700px;
height: 600px;
background-color: lightcoral;
`;

const [modalbool, setModalbool] = useState(false);

{modalbool ? (
  <Backdrop onClick={(e) => {
    // 只有点击Backdrop本身时才关闭
    if (e.target === e.currentTarget) {
      setModalbool(false);
    }
  }}>
    <ModalContainer>
      {/* 模态框内容 */}
    </ModalContainer>
  </Backdrop>
) : null}

两种方法都能实现仅点击遮罩层(Backdrop)时关闭模态框的需求,可根据实际场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 01:09:27