如何解决在 React 控制的组件中清除数据列表输入 onClick
我有一个 html5 输入,在 React 控制的组件中有一个关联的数据列表。我想在单击输入字段或接收焦点时清除文本,以便显示所有选项以供选择。我在 this question 中遵循了 Alfred 的出色回答,但无法在 React 控制的组件中获得完全相同的结果。不幸的是,在 onClick 处理程序中调用 blur 会阻止我的用户输入多个字符,因为焦点(当然)丢失了。
我怎样才能保持用户在点击文本框时可以输入但清除文本并显示完整选项集的能力?
import React,{ useState } from "react";
const MyForm = () => {
const [options,setoptions] = useState(["Apples","Oranges","Bananas","Grapes"]);
const handleChange = (event) => {
event.target.blur();
};
const clear = (event) => {
event.target.value = "";
};
return (
<>
<input
type="input"
list="optionsList"
onChange={handleChange}
onFocus={clear}
placeholder="Select an option"
/>
<datalist id="optionsList">
{options.map((o) => (
<option key={o}>{o}</option>
))}
</datalist>
</>
);
};
export default MyForm;
请注意,我还尝试了一个调用 clear onClick 而不是 onFocus 的版本。这使我无需在 handleChanges 中调用 blur() 从而解决了输入问题。但是,这需要我单击两次才能看到完整的选项集,因为选项列表似乎在该框被清除之前就已显示。
解决方法
看到你对我的一个问题的评论,所以我想我应该把它贴在这里作为答案。
根据您的用例,这是我认为您需要的
import React,{ useState } from "react";
const MyForm = () => {
const [options,setOptions] = useState(["Apples","Oranges","Bananas","Grapes"]);
const handleChange = (event) => {
if (!event.nativeEvent.inputType) {
event.target.blur();
}
};
const clear = (event) => {
event.target.value = "";
};
return (
<>
<input
type="input"
list="optionsList"
onChange={handleChange}
onClick={clear}
onFocus={clear}
placeholder="Select an option"
/>
<datalist id="optionsList">
{options.map((o) => (
<option key={o}>{o}</option>
))}
</datalist>
</>
);
};
export default MyForm;
为了防止handleChange
正常阻止文本输入,您必须检查event.nativeEvent.inputType
,因为通过点击onChange
触发的datalist
不会有{ {1}} 值。因此,在这种情况下,我们只会在由 inputType
填充时执行输入模糊,并为任何其他事件保持焦点。
我还添加了一个额外的 datalist
处理程序来清除输入,无论输入是否已获得焦点。
我猜您实际上希望将 input
值作为状态,而不是 options
。
因此可能的受控组件实现应该是:
const options = ["Apples","Grapes"];
const EMPTY_INPUT = "";
const MyForm = () => {
const [value,setValue] = useState(EMPTY_INPUT);
const onFocusClear = () => {
setValue(EMPTY_INPUT);
};
const onChange = ({ target: { value } }) => {
setValue(value);
};
return (
<>
<input
value={value}
type="input"
list="optionsList"
onChange={onChange}
onFocus={onFocusClear}
placeholder="Select an option"
/>
<datalist id="optionsList">
{options.map((o) => (
<option key={o}>{o}</option>
))}
</datalist>
Value: {value}
</>
);
};
通过删除 onChange
使其成为不受控制的组件非常简单。现在您在 ref.current.value
中有输入值(不是很有用的用例,只是一个示例)。
const MyForm = () => {
const inputRef = useRef();
const onFocusClear = () => {
inputRef.current.value = ''
};
return (
<>
<input
type="input"
list="optionsList"
onFocus={onFocusClear}
placeholder="Select an option"
/>
<datalist id="optionsList">
{options.map((o) => (
<option key={o}>{o}</option>
))}
</datalist>
</>
);
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。