包装后的防抖函数
Rest
...args: Argsconst logMessage = debounce((msg: string) => {
console.log(msg);
});
logMessage("第一次调用"); // 不会立即执行
logMessage("第二次调用"); // 取消第一次,重新计时
// 等待1000ms后,只会打印:"第二次调用"
const saveInput = debounce((id: number, value: string) => {
api.save(id, value);
}, 500);
input.addEventListener('input', (e) => {
saveInput(1, e.target.value); // 快速输入时只会触发最后一次
});
function SearchBox() {
const [query, setQuery] = useState('');
const debouncedSearch = useMemo(() => debounce((q: string) => {
searchAPI(q);
}, 300), []);
useEffect(() => {
debouncedSearch(query);
return () => debouncedSearch.cancel(); // 组件卸载时取消
}, [query]);
return <input onChange={(e) => setQuery(e.target.value)} />;
}
class Editor {
private debouncedSave = debounce((content: string) => {
this.saveToDB(content);
}, 1000);
public onContentChange(content: string) {
this.debouncedSave(content);
}
private saveToDB(content: string) {
// 保存逻辑
}
}
// 如果需要立即执行版本,可以这样扩展:
function advancedDebounce(fn: Function, delay = 1000, immediate = false) {
let timer: NodeJS.Timeout;
return function(this: any, ...args: any[]) {
if (immediate && !timer) {
fn.apply(this, args);
}
clearTimeout(timer);
timer = setTimeout(() => {
if (!immediate) {
fn.apply(this, args);
}
timer = null;
}, delay);
};
}
函数防抖装饰器