reactjs - 用反应钩子去抖动(几秒钟内只有一次触发功能)
问题描述
我需要在用户输入上实现标签搜索,但输入速度很快,我不想为用户输入的每个符号触发 DB 调用,所以我是古玩,有没有一种简单的好方法来消除 api 调用的抖动让我们说 - 一个3秒延迟后的时间?
现在我想出了这个:
let searchDelay
async function handleTagSearch(e) {
clearTimeout(searchDelay)
tagSearchPhraseSet(e.target.value)
searchDelay = setTimeout(async () => {
if (e.target.value.length > 3) {
let res = await fetch('api/tag_seatch/' + e.target.value)
res = await res.json()
console.log(res)
}
}, 3000)
}
但这是正确的方法吗?
解决方案
你的解决方案看起来很有希望,如果你确保searchDelay
数字在渲染之间保持不变,例如一个useRef
钩子。
另一种解决方法是使用useEffect
每次输入value
更改时运行的钩子。从给定的函数中,useEffect
您可以返回一个清除上次运行超时的函数。
例子
const { useState, useEffect } = React;
function App() {
const [value, setValue] = useState("");
const [result, setResult] = useState(null);
useEffect(
() => {
if (value.length < 3) {
setResult(null);
return;
}
const timeout = setTimeout(() => {
setResult(Math.random());
}, 3000);
return () => clearTimeout(timeout);
},
[value]
);
return (
<div>
<input value={value} onChange={e => setValue(e.target.value)} />
<div>{result}</div>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
推荐阅读
- c# - 单击 DataGrid 的列名会生成 System.InvalidOperationException
- javascript - StencilJs 在新窗口中渲染组件
- java - 错误消息:无法解析类型 java.lang.Object。它是从所需的 .class 文件中间接引用的
- jenkins - 如何从 gradle 任务中调用 groovy 函数?
- mysql - 尝试向 MySQL 中的 table.column 添加唯一约束时出现重复条目错误
- java - 我有一个 java 空异常
- lambda - 未触发无服务器框架自定义 lambda 授权程序
- github-actions - GitHub Actions - 有什么地方可以列出所有这些吗?
- php - 如何在 PHP 中使用 echo 进入另一个页面
- javascript - React JS:循环遍历数组并每 3 个项目创建一个 div