在外部单击时关闭持久性材料UI抽屉

vij*_*ode 1 javascript reactjs material-ui

我想用Drawer componentMaterial-UI React。我希望里面的状态Drawer component在关闭Drawer组件时不应该丢失,因此我传入variant="persistent"了Drawer组件。

现在的问题是,默认情况下,抽屉Persistent Drawer不提供抽屉,因此我无法在外部点击时将其关闭。我也尝试过,但仍然无法正常工作。backdrop functionalitytemporary{{ModalProps={{ onBackdropClick: this.toggleDrawer }} }}

有什么解决方法吗?

材质用户界面版本:1.0.0

谢谢

CodeSandbox链接

Ras*_*uls 17

为了搜索者登陆这个问题。如果您遇到问题ClickAwayListener并且不使用variant='persistent'. 试试这个:提供一个切换功能ModalProps onBackdropClick

<Drawer
  open={drawerIsOpen}
  ModalProps={{ onBackdropClick: this.toggleDrawer }}
>
  <MenuItem>drawer item 1</MenuItem>
</Drawer>
Run Code Online (Sandbox Code Playgroud)

2021 年 7 月更新:

我最近更新material-ui/core到版本4.12.1并注意到它onBackdropClick已被弃用。相反,他们为这个功能添加了原生支持,onClose当在抽屉外单击时,该函数将被自动调用,现在它给出了reason为什么被调用的原因:

签名: function(event: object, reason: string) => void

event:回调的事件源。

reason: 可以是: "escapeKeyDown", "backdropClick"

请参阅此处的示例:https : //material-ui.com/api/modal/ 向下滚动到 onBackDropClicked - 它对抽屉的作用与对抽屉的作用相同

改为这样做:

<Drawer
  open={drawerIsOpen}
  onClose={{ (ev, reason) => this.setState({ drawerIsOpen: false }) }}
>
  <MenuItem>drawer item 1</MenuItem>
</Drawer>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。ClickAwayListener 也不适合我,因为它在我尝试打开抽屉时触发,因此阻止了开关打开。这解决了问题,我个人认为它比接受的答案更优雅 (2认同)
  • 这之所以有效,是因为您忽略了删除背景的“variant=”persistent“”约束......它写在问题中。 (2认同)

小智 13

我花了一些时间来解决这个问题,但我发现了一个非常有用的解决方案,就是将变体更改为 Temporary 并使用 de onEscapeKeyDown 和 onBackdropClick 如下:

  <Drawer
    variant="temporary"
    onEscapeKeyDown={handleDrawerClose}
    onBackdropClick={handleDrawerClose}
    open={open}
    ...rest of your code...
Run Code Online (Sandbox Code Playgroud)

  • 轻松完成。非常感谢这个超级有用的解决方案。 (2认同)

Nea*_*arl 10

MUI v5中的工作解决方案:

执着的Drawer

用于ClickAwayListener了解用户何时在Drawer. 您还需要设置mouseEvent="onMouseDown",否则onClickAway在用户单击打开按钮后会触发回调,并在打开按钮Drawer之前立即关闭。

<ClickAwayListener
  mouseEvent="onMouseDown"
  touchEvent="onTouchStart"
  open={open}
  onClickAway={() => open && setOpen(false)}
>
  <Drawer variant="persistent" {...props} />
</ClickAwayListener>
Run Code Online (Sandbox Code Playgroud)

暂时的Drawer

<Drawer
  variant="temporary"
  open={open}
  onClose={(_, reason) =>
    reason === 'backdropClick' && setOpen(false)
  }
>
Run Code Online (Sandbox Code Playgroud)

现场演示

Codesandbox 演示


Jos*_*ing 5

您可以ClickAwayListener为此使用组件。
https://material-ui.com/api/click-away-listener/

import ClickAwayListener from '@material-ui/core/ClickAwayListener';

const drawer = (
      <ClickAwayListener onClickAway={this.handleDrawerClose}>
        <Drawer
          variant="persistent"
          anchor={anchor}
          open={open}
          classes={{
            paper: classes.drawerPaper
          }}
        >
          <div className={classes.drawerHeader}>
            <IconButton onClick={this.handleDrawerClose}>
              {theme.direction === "rtl" ? (
                <ChevronRightIcon />
              ) : (
                <ChevronLeftIcon />
              )}
            </IconButton>
          </div>
          <Divider />
          <List>a asdasd</List>
          <Divider />
          <List>asdasd</List>
        </Drawer>
      </ClickAwayListener>
    );
Run Code Online (Sandbox Code Playgroud)

https://codesandbox.io/s/072ny1rjw

  • 这有些奇怪。我试图做同样的事情,不得不谷歌,因为它让我感到困惑。无论如何,每次单击其他地方时都会调用“onClickedAway”,即使抽屉未打开(所以它仍然呈现,未打开时?)。这会导致打开/关闭函数发生冲突,当我单击打开按钮时,也会从 ClickAwayListener 调用关闭函数。 (3认同)