javascript - 如果没有其他变化,则在 1 秒后状态发生变化时运行函数 in useeffect
问题描述
我正在尝试创建一个搜索栏,该搜索栏向我的服务器发送请求以在用户写入时给出结果。如果他/她写得很快,一旦用户写了就发送请求似乎有点不切实际,所以我想让 useEffect 钩子中的函数在没有输入的情况下在 1 秒后处理这个运行,并且每次用户输入内容时重置该计时器。
代码目前是这样工作的,但我想添加上面描述的功能,但我真的不知道如何去做。有人对此有解决方案吗?
React.useEffect(() => {
if (input.length > 1) {
(async () => {
try {
setLoading(true);
const res = await axiosget<Searchresult[]>(
`search/input=${input}`
);
setSearchresults(res);
} catch {
setSearchResults([]);
}
setLoading(false);
})();
} else {
setSearchResults([]);
}
}, [input]);
谢谢!
解决方案
您正在描述“去抖动”功能。我要么使用提供此功能的众多 库之一,要么至少将您自己的实现抽象为一个以通用方式处理去抖动的函数。
这个想法是每次发生变化时调用 debounce 函数,但它的实现仅在该函数在一段时间内没有被调用后运行。
然后你可以做类似的事情:
const doSearch = useCallback(
debounce(async (input: string) => {
try {
setLoading(true)
const res = await axios.get<Searchresult[]>(`search/input=${input}`)
setSearchresults(res)
} catch {
setSearchResults([])
}
setLoading(false)
}, 500), // 500ms is the debounce threshold
[],
)
React.useEffect(() => {
if (input.length > 1) {
doSearch()
} else {
setSearchResults([])
}
}, [input, doSearch])
推荐阅读
- reactjs - Rollup 正在为 Reactjs 应用程序制作一个比 webpack 大近 4 倍的大包大小
- javascript - 我目前正在研究 Javascript 并坚持在对象中使用 for 循环
- machine-learning - Pytorch 模型 CPU 和 GPU 的参数变化
- android - startActivity 在 fcm 中的 onMessageReceived 内不起作用
- java - 有没有更好的方法在 Java 中使用转义字符和双引号构建以下字符串?
- c# - 以编程方式禁用/启用 Windows 10 设备
- java - 无法推断 Java 中的功能接口类型错误
- c - 当 linux 在使用 ptrace 挂接 recv 时发送 ack
- python - 不确定为什么 tkinter 按钮没有正确调整大小
- javascript - JS中对象的锁定行为?