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

MUI 5.6.0 SwipeableDrawer阻止关闭后无法恢复原尺寸求助

解决MUI 5.6.0 SwipeableDrawer阻止滑动关闭后停留在半开状态的问题

方案1:临时切换open状态触发恢复动画

当不符合关闭逻辑时,短暂切换open状态触发组件的过渡动画,让抽屉自动回到初始位置,无需操作DOM:

const [open, setOpen] = useState(false);

const handleClose = (event, reason) => {
  if (logic) {
    setOpen(false);
  } else {
    // 临时切换状态触发恢复动画
    setOpen(false);
    requestAnimationFrame(() => {
      setOpen(true);
    });
  }
};

return (
  <SwipeableDrawer
    anchor="bottom"
    open={open}
    onClose={handleClose}
    onOpen={() => setOpen(true)}
  >
    {/* 抽屉内容 */}
  </SwipeableDrawer>
);

方案2:调用组件内部滑动重置方法(适配MUI 5.6.0)

通过useRef获取抽屉实例,调用其内部的滑动状态重置方法,直接恢复抽屉位置:

import { useRef, useState } from 'react';
import SwipeableDrawer from '@mui/material/SwipeableDrawer';

const [open, setOpen] = useState(false);
const drawerRef = useRef(null);

const handleClose = (event, reason) => {
  if (logic) {
    setOpen(false);
  } else {
    // 调用内部方法重置滑动状态
    drawerRef.current?._swipeable?.reset();
  }
};

return (
  <SwipeableDrawer
    ref={drawerRef}
    anchor="bottom"
    open={open}
    onClose={handleClose}
    onOpen={() => setOpen(true)}
  >
    {/* 抽屉内容 */}
  </SwipeableDrawer>
);

方案3:手动重置DOM样式(兜底方案)

如果前两种方法无效,可直接操作抽屉的DOM元素,强制重置位置样式:

import { useRef, useState } from 'react';
import SwipeableDrawer from '@mui/material/SwipeableDrawer';

const [open, setOpen] = useState(false);
const drawerRef = useRef(null);

const handleClose = (event, reason) => {
  if (logic) {
    setOpen(false);
  } else {
    // 针对bottom锚点,手动重置抽屉位置
    const paperElement = drawerRef.current?.querySelector('.MuiDrawer-paper');
    if (paperElement) {
      paperElement.style.transform = 'translateY(0)';
      // 临时移除过渡避免突兀,随后恢复
      paperElement.style.transition = 'none';
      requestAnimationFrame(() => {
        paperElement.style.transition = '';
      });
    }
  }
};

return (
  <SwipeableDrawer
    ref={drawerRef}
    anchor="bottom"
    open={open}
    onClose={handleClose}
    onOpen={() => setOpen(true)}
  >
    {/* 抽屉内容 */}
  </SwipeableDrawer>
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:05:57