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

如何监听MUI Modal组件的打开/关闭状态及关闭动画完成事件?

解决MUI Modal动画结束后执行回调的问题

MUI的Modal组件自带的onClose确实是在关闭动画启动时就触发了,要等动画完全结束再执行逻辑,其实可以利用过渡组件的onExited事件来实现,下面给两种常用方案:

  • 自定义过渡组件监听结束事件
    如果你直接用Modal组件,可以通过TransitionComponent传入带onExited回调的过渡组件(比如Fade),这个回调会在动画彻底结束后触发。示例代码:

    import Modal from '@mui/material/Modal';
    import Fade from '@mui/material/Fade';
    
    function MyModal({ open, onClose, afterClose }) {
      const handleAnimationEnd = () => {
        // 这里写动画结束后要执行的逻辑
        afterClose();
      };
    
      return (
        <Modal
          open={open}
          onClose={onClose}
          // 自定义过渡组件,绑定onExited事件
          TransitionComponent={(props) => (
            <Fade {...props} onExited={handleAnimationEnd} />
          )}
        >
          <div style={{ padding: 20, background: '#fff', margin: 'auto' }}>
            这是Modal内容
          </div>
        </Modal>
      );
    }
    
  • 用Dialog组件简化操作(如果适用)
    如果你用的是基于Modal封装的Dialog组件,更简单,直接通过TransitionProps传递onExited即可:

    import Dialog from '@mui/material/Dialog';
    import DialogContent from '@mui/material/DialogContent';
    
    function MyDialog({ open, onClose, afterClose }) {
      return (
        <Dialog
          open={open}
          onClose={onClose}
          TransitionProps={{
            onExited: afterClose // 直接把结束逻辑传进去
          }}
        >
          <DialogContent>
            这是Dialog内容
          </DialogContent>
        </Dialog>
      );
    }
    

原理很简单:MUI的Modal过渡动画是靠Fade、Slide这类过渡组件实现的,这些组件都提供了onExited钩子,专门监听过渡动画完全结束的时刻,刚好能满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:25:52