如何在 React 中实现一个防抖(debounce)的搜索输入框?
如何在 React 中实现一个防抖(debounce)的搜索输入框?
回答:
可以使用自定义 Hook 结合 lodash 的 debounce 函数,或手动实现防抖逻辑。以下是使用自定义 Hook 的示例:
import { useState, useEffect, useCallback } from 'react';
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => clearTimeout(handler);
}, [value, delay]);
return debouncedValue;
}
function SearchInput() {
const [inputValue, setInputValue] = useState('');
const debouncedSearchTerm = useDebounce(inputValue, 500);
useEffect(() => {
if (debouncedSearchTerm) {
// 执行搜索逻辑,如调用 API
console.log('Searching for:', debouncedSearchTerm);
}
}, [debouncedSearchTerm]);
return (
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="Search..."
/>
);
}
解析:
- 防抖(Debounce) 的核心思想是:在用户停止输入一段时间(如 500ms)后再执行操作,避免频繁触发(例如每次按键都发起请求)。
useDebounce自定义 Hook 接收原始值和延迟时间,返回防抖后的值。useEffect中使用setTimeout设置延迟更新,并在组件卸载或依赖变化时通过clearTimeout清理定时器,防止内存泄漏。- 主组件中监听
debouncedSearchTerm的变化,在其更新时执行搜索逻辑,从而实现高效、响应式的搜索体验。
这种方法避免了第三方库依赖,且逻辑清晰、可复用。

发表评论 (审核通过后显示评论):