在material UI的hooks版本中,似乎无法在onChange事件发生后清除自动完成功能:
// @flow
import React, { useRef, useState } from "react";
import "./Autocomplete.scss";
import AutocompleteUI from "@material-ui/lab/Autocomplete";
import TextField from "@material-ui/core/TextField";
function Autocomplete(props) {
const { options } = props;
const [value, setValue] = useState();
const container = useRef();
const input = useRef();
function onChange(event, newValue) {
if (!newValue) return;
props.onChange(newValue);
setValue(undefined);
input.current.value = "";
event.target.value = "";
}
function renderInput(params) {
return (
<TextField
inputRef={input}
{...params}
inputProps={{
...params.inputProps,
autoComplete: "disabled", // disable autocomplete and autofill
}}
margin="none"
fullWidth
/>
);
}
return (
<div className="Autocomplete-container">
{value}
<AutocompleteUI
ref={container}
options={options}
autoHightlight={true}
clearOnEscape={true}
autoSelect={true}
// freeSolo={true}
getOptionLabel={option => option.title}
renderInput={renderInput}
value={value}
onChange={onChange}
/>
</div>
);
}
export default Autocomplete;
深入研究source code,我注意到该组件在内部使用了useAutocomplete钩子。但是,内部存在于该挂钩中的 setInputValue 和 resetInputValue 都不会暴露在外部。有没有办法在onChange之后完成输入的清除?
答案 0 :(得分:2)
您需要将inputValue属性设置为您的valueState,并且在onhange函数上只需清除valueState
<Autocomplete
inputValue={valueState}
onChange={(value, option) =>
{
setOptions([])
setValueState("")
}}
renderInput={params => (
<TextField
dir="rtl"
onChange={(event) =>
{
setValueState(event.target.value)
}}
{...params}
label="Search Patient"
variant="filled"
InputProps={{
...params.InputProps,
endAdornment: (
<React.Fragment>
{loading ? (
<CircularProgress color="inherit" size={20} />
) : null}
{params.InputProps.endAdornment}
</React.Fragment>
)
}}
/>
)}
/>
答案 1 :(得分:2)
我遇到了同样的问题,并以此解决了这个问题:
const [search, setSearch] = useState("");
...
<Autocomplete
id="grouped-demo"
options={tagsList}
getOptionLabel={(option) => option.tag}
onChange={(event, value) =>value ? setSearch(value.tag) : setSearch(event.target.value)}
style={{width: 700}}
renderInput={(params) => <TextField {...params} label="Search" variant="outlined"/>}
/>
答案 2 :(得分:0)
哟!我很确定材料中的Textfield组件采用了“ autoComplete”道具,并且您可以传递字符串“ false”。另外,它也不会输入inputProps,请尝试一下。
<Textfield autoComplete="false" />
答案 3 :(得分:0)
我在搜索/导航栏中使用“自动完成/文本字段”遇到了类似的情况。在onChange事件中使用history.push
或其他Router函数后,该值将始终被保留。诀窍是设置inputValue = ""
。每次渲染组件时,先前的值都会被删除。见下文
<Autocomplete
{...defaultProps}
onChange={(event, value) => {
if(value)
router.history.push(`/summary`);
}}
filterOptions={filterOptions}
clearOnEscape={true}
inputValue=""
renderInput={params => <TextField {...params}
label="Quick Search" fullWidth
InputProps={{...params.InputProps,
'aria-label': 'description',
disableUnderline: true,
}}/>}
/>
答案 4 :(得分:-1)
我遇到了同样的问题,并以此解决了这个问题:
const [value, setValue] = useState(null);
那么您就不需要引用了。