javascript - 为什么 clearTimeout 没有在关闭内关闭超时
问题描述
我正在尝试创建一个用于实时搜索的 onChange 闭包,但是,现在它正在为所有输入的内容发出 AJAX 请求,而不是清除超时。我错过了什么?
export function SearchForm({ search, page, btnText, fixPage}) {
const [term, setTerm] = useState('');
const handleSubmit = (e,term) => {
e.preventDefault();
search(term, page);
fixPage();
}
// const delayedQuery = useCallback(debounce((e,val) => handleSubmit(e,val), 500),[])
// const handleChange = e => {
// const { value } = e.target;
// setTerm(value);
// delayedQuery(e,value);
// };
const handleChange = (timeout => e => {
const { value } = e.target;
clearTimeout(timeout);
timeout = setTimeout(() => {
handleSubmit(e,value);
}, 1000);
setTerm(value);
})();
return (
<form onSubmit={handleSubmit}>
<input type="text"
placeholder="Search for a specific company..."
value={term}
onChange={handleChange} />
<button type="submit">Find {btnText}</button>
</form>
);
}```
解决方案
在每次渲染时,您都在重新创建,handleChange
因此旧的计时器参考不可用。例如,您需要将计时器的引用存储在useRef
挂钩中。
这应该有效:
const timerRef = useRef();
const handleChange = (timeout => e => {
const { value } = e.target;
clearTimeout(timeout);
timeout = setTimeout(() => {
handleSubmit(e,value);
}, 1000);
setTerm(value);
})(timerRef.current);
推荐阅读
- php - 将包含空格的字符串作为响应从 php 发送到 Android
- jquery - 在新选项卡中打开外部链接,但排除某些链接
- r - R mutate ifelse 用计算的函数值更新条件行
- python - 动态规划 - 洗车
- amazon-web-services - 使用 terraform 创建 ec2 实例时生成包含“IP 地址”的 user_data
- c++ - 一旦对象设置为null,用于声明对象堆大小的变量被设置为null?
- android - android apk jenkins 的存档工件
- python - Python:编写识别对象并对其进行计数的代码
- php - Unix 时间到第二天的时间戳
- android - 使用默认视频意图 ACTION_VIDEO_CAPTURE 录制不带声音的视频或在视频录制后删除声音,例如快速聊天