【发布时间】:2020-02-25 18:59:26
【问题描述】:
在material UI 的钩子版本中,我似乎无法在 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 之后完成输入清除?
【问题讨论】:
-
清除自动补全是清空输入框,还是删除建议?
-
@ChrisB。是的,前者,我正在尝试清除输入框。
-
显然它只适用于 refs,在我看来,这是一个可重用 React 组件的愚蠢设计。您必须直接在 DOM 元素上设置值,但我不熟悉他们的 API。
-
@ChrisB。我尝试使用 refs 并直接更改输入的值,但是由于组件本身保持状态(通过 useAutocomplete 挂钩)它不起作用
标签: reactjs material-ui react-hooks