【问题标题】:Material-UI Select, how to apply :focus-within styling on the select when the input is clicked?Material-UI Select,单击输入时如何在选择上应用 :focus-within 样式?
【发布时间】:2021-07-02 19:20:56
【问题描述】:

我在 div 组件中使用 Select:

<div className="custom-filter custom-filter-data">
            <DateRangeIcon className="search-icon"/>
            <FormControl variant='standard' ref={addrRef} className= 
                {classes.formControl}>                
              <Select
                labelId="demo-simple-select-label"
                id="demo-simple-select"
                defaultValue=""
                onFocus={(e) => {addrRef.current.focus()}}
                displayEmpty
              >
                <MenuItem value="" disabled>
                  Seleziona data
                </MenuItem>
                <MenuItem value={10}>Ten</MenuItem>
                <MenuItem value={20}>Twenty</MenuItem>
                <MenuItem value={30}>Thirty</MenuItem>
              </Select>
            </FormControl>
              //other components
         </div>

css 容器

.custom-filter:focus-within{
  color: #495057;
  background-color: #fff;
  border-color: #80bdff;
  outline: 0;
  box-shadow: 0 0 0 0.2rem rgb(0 123 255 / 25%);
}

我需要在单击选择输入时触发对选择的关注,以利用父容器的 :focus-within 样式。现在父 :focus-within 正在处理 onChange 事件(当我选择 MenuItem 时)。如您所见,我尝试过使用 useRef() 但不起作用...似乎当用户单击选择的输入时,它会阻止所有其他焦点...

https://codesandbox.io/s/react-material-ui-select-forked-8msbu?file=/src/index.js

【问题讨论】:

  • 你能整理一个可运行的例子吗?
  • 您能否进一步澄清您的问题。很难理解你想要什么。如果您想在用户单击SelectInput 时执行一些代码,请附加一个焦点侦听器,如下所示:Select onFocus={e =&gt; console.log('focus')} /&gt;
  • 你能把你的代码放到 CodeSandbox 上吗?
  • 您使用的是 MUI v1 吗?它现在不受支持,当我尝试将 ref 传递给组件时,您的 CodeSandbox 不会运行。
  • @July 您可以在 Material-UI 文档和许多使用 Material-UI v4 的 StackOverflow 问题中找到许多 CodeSandbox 示例。使用 v1 的 CodeSandbox 没有帮助,如果那不是您正在使用的。

标签: javascript reactjs material-ui


【解决方案1】:

默认情况下,Selectportal 中打开其选项的弹出窗口(通过Menu 组件实现)。这意味着菜单项不是 DOM 中 div 的后代,因此当焦点位于菜单或菜单项上时,div 上的 :focus-within 选择器不匹配。

您可以通过将MenuProps={{ disablePortal: true }} 添加到Select 来更改此行为。

相关文档:

这是您的沙盒的修改版本:

import React from "react";
import ReactDOM from "react-dom";
import Input from "@material-ui/core/Input";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";
import "./styles.css";

const App = () => {
  const [value, setValue] = React.useState("");
  return (
    <div className="custom-filter custom-filter-data">
      <FormControl>
        <InputLabel htmlFor="age-simple">Age</InputLabel>
        <Select
          style={{ minWidth: "100px" }}
          value={value}
          input={<Input id="age-simple" />}
          onChange={(event) => setValue(event.target.value)}
          MenuProps={{ disablePortal: true }}
        >
          <MenuItem value="">
            <em>None</em>
          </MenuItem>
          <MenuItem value={10}>Ten</MenuItem>
          <MenuItem value={20}>Twenty</MenuItem>
          <MenuItem value={30}>Thirty........</MenuItem>
        </Select>
      </FormControl>
    </div>
  );
};

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

【讨论】:

  • 非常感谢!!!!!!这就是我一直在寻找的
  • 请问先生,如果我打开选择的菜单并通过单击元素外部将其关闭,而不选择任何菜单选项,则焦点停留在具有此气泡效果的父容器上(模糊+焦点)。当我不选择选项而只是关闭菜单时,有一种方法可以消除这种影响并移除焦点?我试过了,但没有成功...
猜你喜欢
  • 2018-09-14
  • 2020-11-08
  • 1970-01-01
  • 2021-04-06
  • 2020-08-10
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多