javascript 如何防止MUI对话框在按Esc键时被删除,并在单击离开时添加抖动效果?

mwngjboj  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(112)

我有一个MUI对话框,当我在外面点击时,它不能被删除。我想添加一个震动效果或任何效果的对话框时,用户点击离开,使用户知道,点击离开被阻止。此外,我想防止用户使用Esc按钮来删除对话框太多。建议的答案可以部分解决我的问题,只是Esc按钮使用disableEscapeKeyDown属性,但不是我的问题的其余部分,因为disableBackdropClick不能应用。
这是我的代码。在handleClose函数中应用clickAway。但我想添加一个效果,使用户知道,点击离开是不允许的,并防止使用Esc按钮删除对话框。有什么建议吗?我找不到任何解决办法。谢谢

export const StatusModalFail = (): ReactElement => {
  const [open, setOpen] = useState(true);

  const handleClose = (event, reason) => {
    if (reason !== 'backdropClick') {
      setOpen(false);
    }
  };

  const handleCloseButton = () => {
    setOpen(false);
  };

  return (
    <Stack
      justifyContent="center"
      alignItems="center"
    >
      <Dialog
        open={open}
        PaperProps={{
          sx:{
            width: '100%',
            maxWidth: '500px!important',
            height:'100%',
            maxHeight:'250px!important',
          },
        }}
        onClose={handleClose}
      >
        <DialogContent>
          <Box
            sx={{
                  display: 'flex',
                   justifyContent: 'center',
                  alignItems: 'center',
            }}
          >
            <CrossIcon
              style={{
                    color: '#fa6757',
                    width: 48,
                    height: 48,
                    padding: 30,
              }}
            />
          </Box>
whlutmcx

whlutmcx1#

这是一个关于你如何做到这一点的例子。我在这里提供codesanbox:https://codesandbox.io/s/hardcore-wing-0mvnqc?file=/demo.js

  • 创建新的状态来处理当你需要摇动/动画对话框

const [shake, setShake] = React.useState(false);

  • 在handleClose函数中:
const handleClose = (e, reason) => {
      if (reason !== "backdropClick" && reason !== "escapeKeyDown") {
        setOpen(false);
      }
     if (reason === "backdropClick" || reason === "escapeKeyDown") {
       setShake(true);
      }
   };
  • shake状态作为属性传递给对话框组件
<BootstrapDialog
       shake={shake}
       ...
  • 这样,您就可以在styled对话框中调用shake状态
const BootstrapDialog = styled(Dialog)(({ theme, shake }) => ({
  • 并使用它来确定是否要激活动画。您需要指向.MuiDialog-container以应用动画:
"& .MuiDialog-container": {
   animation: `${!shake ? "none" : `${myEffect} 1s infinite !important`}`
 }
 // define myEffect using keyframe imported from @emotion/react
  • 这里的关键帧示例(您可以根据需要自定义)
const myEffect = keyframes`
    0% { transform: translateX(0) }
    25% { transform: translateY(-9px) }
    35% { transform: translateY(-9px) rotate(17deg) }
    55% { transform: translateY(-9px) rotate(-17deg) }
    65% { transform: translateY(-9px) rotate(17deg) }
    75% { transform: translateY(-9px) rotate(-17deg) }
    100% { transform: translateY(0) rotate(0) }
  `;
  • 你就可以走了

相关问题