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
在 Button 组件上,不要使用 onClick,像这样尝试 onMouseDown:
noOptionsText={
<Button onMouseDown={() => {
console.log("CLICK SUCCESSFUL")
}}>
No results! Click me
</Button>
Run Code Online (Sandbox Code Playgroud)
这是重复的副本:无选项的材料 UI 自动完成中的操作按钮
当您单击无选项菜单中的按钮时,该按钮是模糊的(没有焦点),您可以通过在回调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)
| 归档时间: |
|
| 查看次数: |
2116 次 |
| 最近记录: |