MUI ClickAwayListener 单击时关闭模式本身(React.Js)

Posted

技术标签:

【中文标题】MUI ClickAwayListener 单击时关闭模式本身(React.Js)【英文标题】:MUI ClickAwayListener closing the modal itself when clicked (React.Js) 【发布时间】:2021-12-06 06:58:19 【问题描述】:

模态所需的功能是,当单击“更多”按钮时,它应该是可见的,并且当单击更多按钮或屏幕的任何其他部分(不包括模态本身)时,模态应该关闭.从https://usehooks-typescript.com/react-hook/use-on-click-outside和MUI的ClickAwayListener开始,我尝试了各种方法。

<ClickAwayListener
  onClickAway=handleClickAway
>
  <div style= position: 'relative' >
    <button
      onClick=(e: any) => 
        e.stopPropagation();
        setModalVisible(!modalVisible);
      
    >
      More
    </button>
    <Modal
      visible=modalVisible
      id="btn-container"
    >
        dummy.map((str: string) => 
          return <span>str</span>;
        )
    </Modal>
  </div>
</ClickAwayListener>
const handleClickAway = (e: any) => 
    if (e.target.localName === 'body') 
      e.preventDefault();
      return;
    

    setModalVisible(false);
  ;
const Modal = styled.div`
  position: absolute;
  top: 30px;
  left: -200px;
  background: #fff;
  padding: 25px;
  z-index: 8;
  visibility: $( visible ) => (visible ? 'visible' : 'hidden');
  box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.2);
  width: 250px;
  max-height: 320px;
  overflow-y: auto;
`;

基本上,ClickAwayListener 无法检测到它的子组件,并且即使我在不​​应该是功能的模式内部单击时也会关闭模式。

这里使用的'Modal'组件不是materialui组件,是我自己构建的样式化组件

【问题讨论】:

【参考方案1】:
    Modal 中使用onBackdropClick 而不是onClickAway,当您在Modal 之外单击时会触发onBackdropClick
<Modal onBackdropClick=() => setOpen(false)
    Modal 中使用onClose 而不是onBackdropClickonCloseModal 想要自行关闭时触发
<Modal onClose=(_, reason) => reason === 'backdropClick' && setOpen(false)
    使用Dialog 而不是ModalDialog 是包含 Modal 的组件,具有良好的开箱即用默认样式,而 Modal 是用于低级自定义的丑陋表亲。
<Dialog onClose=(_, reason) => reason === 'backdropClick' && setOpen(false)

【讨论】:

很抱歉造成混淆,但 Modal 不是一个材质 ui 组件,它是我自己构建的一个非常基本的样式组件。你能相应地更新你的答案吗? @HardikAswal 为什么不使用 MUI 组件?我会更新我的答案。 @HardikAswal 另外请将您的模态定义代码放入您的问题中。 我已经分享了模态代码。出于多种原因,我不想使用 mui 对话框,而宁愿坚持使用我自己构建的这种模式。 我唯一的问题是,为什么 ClickAwayListener 无法检测到它自己的子组件?

以上是关于MUI ClickAwayListener 单击时关闭模式本身(React.Js)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MUI 中单击卡片时添加波纹效果

我正在使用 MUI-Data-Tables,我想在单击对列进行排序后更改标题文本颜色?

复选框上的多行选择和单击 MUI DataGrid 中的行时的单选

MUI框架如何获取当前标签的子标签

MUI常用脚本及原生JavaScript常用操作元素方法

未生成 Storybook MUI v5 文档