【问题标题】:Material UI input loses focus when opening menu打开菜单时,材质 UI 输入失去焦点
【发布时间】:2021-01-17 12:31:01
【问题描述】:

我正在尝试做输入字段,当它被聚焦时会打开菜单。菜单打开得很好,但输入字段在菜单可见时失去焦点和所有自定义样式。 任何想法如何在菜单可见的同时保持对输入的关注?

这是我的处理程序:

const [anchorElSearch, setAnchorElSearch] = React.useState(null);

const handleClickSearch = (event) => {
  setAnchorElSearch(event.currentTarget);
};

这是我的输入字段和菜单组件:

<Input
  className={classes.searchInput}
  classes={{ focused: classes.searchInputFocused }}
  aria-controls="searchMenu"
  aria-haspopup="true"
  onClick={handleClickSearch}
/>
<Menu
  id="searchMenu"
  anchorEl={anchorElSearch}
  keepMounted
  open={Boolean(anchorElSearch)}
>
  <MenuItem onClick={handleCloseSearch}>Works</MenuItem>
</Menu>

【问题讨论】:

  • 你只关心菜单打开时样式的持续存在还是真的关心焦点的持续存在?后者可能会被认为是糟糕的用户体验,因为您会期望用户与他们刚刚打开的菜单进行交互。
  • 我正在尝试做和 github 一样的搜索栏

标签: reactjs material-ui


【解决方案1】:

我会放弃Menu 组件并实现如下内容:

const { ClickAwayListener, Input, MenuList, MenuItem, makeStyles } = MaterialUI

const useStyles = makeStyles({
  searchInputFocused: {
    border: "1px solid hotpink"
  }
});

function App() {
  const classes = useStyles();
  const [open, setOpen] = React.useState(false);

  const handleClickSearch = () => {
    setOpen((prev) => !prev);
  };

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

  return (
    <ClickAwayListener onClickAway={handleClose}>
      <div>
        <Input
          classes={{ focused: classes.searchInputFocused }}
          onClick={handleClickSearch}
        />
        {open ? (
          <MenuList
            onClick={handleClose}
            style={{ background: "#eeeeee" }}
          >
            <MenuItem>Item 1</MenuItem>
            <MenuItem>Item 2</MenuItem>
            <MenuItem>Item 3</MenuItem>
          </MenuList>
        ) : null}
      </div>
    </ClickAwayListener>
  );
}

ReactDOM.render(<App />, document.getElementById('root'))
<script src="https://unpkg.com/react@latest/umd/react.development.js" crossorigin="anonymous"></script>
<script src="https://unpkg.com/react-dom@latest/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@material-ui/core@latest/umd/material-ui.development.js" crossorigin="anonymous"></script>
<script src="https://unpkg.com/babel-standalone@latest/babel.min.js" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" />
<div id="root"></div>

【讨论】:

  • 试过了,但由于某种原因,打开菜单列表时整个输入字段消失了。这样做和你做的完全一样,问题在其他地方..试图弄清楚发生了什么
  • 无法正常工作。我试图注释掉所有样式,但单击输入会打开菜单列表但隐藏输入本身..
  • 给我一个密码箱,我去看看。请尝试删除您确信不相关的代码。
  • 或者,只需从我的代码开始,然后逐步添加您的代码。这应该让您知道是什么导致了问题。
  • 我认为解决这个问题可能太复杂了,所以我解决了打开输入栏顶部菜单组件的问题,并为其提供了一些样式。意识到 github 可能也是这样做的,如果您仔细观察,您会看到菜单下方的输入蓝色轮廓。
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2021-04-03
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多