当前位置: 首页 > 面试题库 >

在选择组件中按下选项的第一个字母时,如何禁用对项目的选择?

帅令雪
2023-03-14
问题内容

我正在使用实质性的UI Select组件,并且试图在内部构建过滤器以仅显示与用户输入的内容匹配的项目。

我为正在开发的内容构建了一个最小的示例。

function App() {
  const [selectedOption, setSelectedOption] = React.useState("");
  const [filterExpression, setFilterExpression] = React.useState("");

  const onChangeSelection = (
    event: React.ChangeEvent<{ name?: string | undefined; value: unknown }>,
    child: React.ReactNode
  ) => {
    const value = event.target.value.toString();
    setSelectedOption(value);
  };

  const onChangeExpression = (
    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
  ) => {
    const value = event.target.value.toString();
    console.log(`value:`, value);
    setFilterExpression(value);
  };

  const stopImmediatePropagation = (e: any) => {
    e.stopPropagation();
    e.preventDefault();
  };

  return (
    <div className="App">
      <Select onChange={onChangeSelection} value={selectedOption}>
        <MenuItem
          dense
          divider
          value={""}
          onClickCapture={stopImmediatePropagation}
        >
          <TextField value={filterExpression} onChange={onChangeExpression} />
        </MenuItem>

        <MenuItem dense key={"One"} value={"One"}>
          One
        </MenuItem>
        <MenuItem dense key={"Two"} value={"Two"}>
          Two
        </MenuItem>
        <MenuItem dense key={"Three"} value={"Three"}>
          Three
        </MenuItem>
      </Select>
    </div>
  );
}

现在我的问题是,默认情况下,选择组件允许用户按下任何字母,并且如果存在第一个字母与用户输入匹配的选项,它将选择该选项。

所以,如果我有3个选项(OneTwoThree)和用户类型O选择部件将选择One选项,我的文本字段不会改变的价值。但是,如果用户键入,F则文本字段将更新为F

我想禁用此行为,所以,我一直在努力阻止类似事件的传播onKeyUpCaptureonChangeCaptureonKeyDownCapture但我没有”能避免这种情况。

您有任何解决建议吗?您可以在此处查看功能示例:


问题答案:

文本焦点导航功能在的onKeyDown中实现MenuList(我大约在6个月前实现了)。停止该事件在上的传播MenuItem(也TextField可以阻止该事件在上的传播)防止事件到达MenuList

import * as React from "react";
import { render } from "react-dom";
import TextField from "@material-ui/core/TextField";
import Select from "@material-ui/core/Select";
import MenuItem from "@material-ui/core/MenuItem";

import "./styles.css";

function App() {
  const [selectedOption, setSelectedOption] = React.useState("");
  const [filterExpression, setFilterExpression] = React.useState("");

  const onChangeSelection = (
    event: React.ChangeEvent<{ name?: string | undefined; value: unknown }>,
    child: React.ReactNode
  ) => {
    const value = event.target.value.toString();
    setSelectedOption(value);
  };

  const onChangeExpression = (
    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
  ) => {
    const value = event.target.value.toString();
    console.log(`value:`, value);
    setFilterExpression(value);
  };

  const stopImmediatePropagation = (e: any) => {
    e.stopPropagation();
    e.preventDefault();
  };

  return (
    <div className="App">
      <Select onChange={onChangeSelection} value={selectedOption}>
        <MenuItem
          dense
          divider
          value={""}
          onClickCapture={stopImmediatePropagation}
          onKeyDown={e => e.stopPropagation()}
        >
          <TextField value={filterExpression} onChange={onChangeExpression} />
        </MenuItem>

        <MenuItem dense key={"One"} value={"One"}>
          One
        </MenuItem>
        <MenuItem dense key={"Two"} value={"Two"}>
          Two
        </MenuItem>
        <MenuItem dense key={"Three"} value={"Three"}>
          Three
        </MenuItem>
      </Select>
    </div>
  );
}

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



 类似资料:
  • 我有两个表和 names表有以下列表: -男性姓名从nameID 1到nameID 10 -女性姓名从nameID 11到nameID 21 -两者都从nameID 23到nameID 31 性别表有三个属性: -女性 -男性 -两者 我正在使用引导选择选项,我想显示从nameID11到nameid21的名称,如果用户从gender选择选项中选择女性,等等,这是可能的吗?我看到其他帖子,我注意到他

  • 如果选择选项值是从循环中提取的,那么如何禁用该选项值?是否有其他方法解决此问题? 示例输出在循环和我想禁用选项值6和7。谢谢帮忙。

  • 我正在尝试使用Puppeteer选择下拉列表中的第一个元素。问题是,选项的值在每次测试中都会更改,所以我不能根据该值选择选项,除非我能够首先检索到该值。 当前使用: 这将选择该选项,但是必须单击下拉项才能提交表单(我无法控制此操作)。 此外,我还尝试使用木偶键盘命令向下箭头并按回车键,但由于某种原因,该功能不起作用。

  • 问题内容: Selenium Select 类具有3种不同的选项选择方法: selectByIndex selectByValue selectByVisibleText 现在,我遇到一种情况,我想通过一些 部分 显示在选项可见文本之一中的文本来选择一个选项(不想让自己暴露在整个文本中)。 例如: 我只想通过提供“ DOLLAR”来选择此选项,例如: 您将如何有效地实施它? 问题答案: 您可以尝试

  • 问题内容: Selenium Select 类具有3种不同的选项选择方法: selectByIndex selectByValue selectByVisibleText 现在,我遇到一种情况,我想按 部分 显示在选项可见文本之一中的某些文本选择一个选项(不想让自己暴露于整个文本中)。 例如: 我只想通过提供“ DOLLAR”来选择此选项,例如: 您将如何有效实施它? 问题答案: 您可以尝试这样的

  • 我想在选择另一个select元素的一个选项时显示一个select元素,在选择另一个选项时隐藏它。 这是JavaScript: 感谢任何帮助。谢谢