材质 UI 自动完成在 noOptionsText 中创建可点击的按钮

edo*_*edo 3 reactjs material-ui

我正在使用 Material Ui Autocomplete 组件。我希望当用户输入某些内容而他没有得到任何结果时,会noOptionsText显示一个可以单击以执行某些操作的按钮:

import React from "react";
import TextField from "@material-ui/core/TextField";
import Autocomplete from "@material-ui/lab/Autocomplete";
import Button from "@material-ui/core/Button";

export default function App() {
  return (
    <Autocomplete
      options={["HELLO", "HI"]}
      renderInput={(params) => (
        <TextField {...params} label="Combo box" variant="outlined" />
      )}
      noOptionsText={
        <Button onClick={() => console.log("CLICK SUCCESSFUL")}>
          No results! Click me
        </Button>
      }
    />
  );
}
Run Code Online (Sandbox Code Playgroud)

此处按钮成功显示,但是当我单击它时,自动完成功能在按钮接收点击之前关闭。

如果我设置debug={true}强制保持菜单打开,它会起作用,但这有许多其他副作用。也尝试强制,open={true}但它仍然被关闭。

你会怎么做?

Codesandbox 演示:https ://codesandbox.io/s/vigilant-haslett-sngyb ? file =/ src/App.js

Not*_*112 5

在 Button 组件上,不要使用 onClick,像这样尝试 onMouseDown:

  noOptionsText={
    <Button onMouseDown={() => {
        console.log("CLICK SUCCESSFUL")
    }}>
      No results! Click me
    </Button>
Run Code Online (Sandbox Code Playgroud)

这是重复的副本:无选项的材料 UI 自动完成中的操作按钮


Nea*_*arl 2

当您单击无选项菜单中的按钮时,该按钮是模糊的(没有焦点),您可以通过在回调TextField中记录原因来知道onClose

onClose={(e, reason) => {
  console.log("on close", reason);
}}
Run Code Online (Sandbox Code Playgroud)

抑制这种情况的唯一方法是debug = true按照 Material-UI API文档中的记录进行设置。

但如果您不想使用debug,还有另一种解决方法,即使按钮成为选项菜单本身的一部分。请记住,与无选项菜单不同,您可以在Autocomplete菜单中注册单击以正常选择选项。

您可以像往常一样通过过滤选项来做到这一点,但如果没有找到选项,则返回按钮选项。这是一个例子

import Autocomplete, { createFilterOptions } from "@material-ui/lab/Autocomplete";

const options = ["HELLO", "HI"];
const buttonOption = (
  <Button
    onClick={(e) => {
      console.log("CLICK SUCCESSFUL");
      e.stopPropagation();
    }}
  >
    No results! Click me
  </Button>
);
const defaultFilterOptions = createFilterOptions();

export default function App() {
  const [selectedOptions, setSelectedOptions] = React.useState("");

  return (
    <Autocomplete
      options={options}
      onChange={(_, value) => {
        if (typeof value === "string") {
          setSelectedOptions(value);
        }
      }}
      renderOption={(o) => o}
      getOptionLabel={(o) => (typeof o === "string" ? o : "")}
      renderInput={(params) => (
        <TextField {...params} label="Combo box" variant="outlined" />
      )}
      filterOptions={(options, state) => {
        const results = defaultFilterOptions(options, state);

        if (results.length === 0) {
          return [buttonOption];
        }

        return results;
      }}
    />
  );
}
Run Code Online (Sandbox Code Playgroud)

现场演示

编辑材质-UI 自动完成无选项按钮