防抖节流函数?防抖节流Hooks
2024 年 5 月 9 日 星期四(已编辑)
/ , ,
15
摘要
防抖函数和节流函数在JavaScript中常用于控制函数的执行频率。防抖函数通过延迟执行来避免连续触发,而节流函数则限制函数在一定时间内只能执行一次。可以使用React Hooks来实现这两种函数,提高逻辑复用性。
这篇文章上次修改于 2024 年 5 月 9 日 星期四,可能部分内容已经不适用,如有疑问可询问作者。
防抖函数
// 定义一个防抖函数
function debounce(fn,wait) {
// 创建一个定时器并初始化为null
var timer = null;
return function () {
// 保存函数执行上下文和参数
var context = this,
args = [...arguments];
// 如果定时器存在则清除定时器
if(timer){
clearTimeout(timer);
timer = null;
}
// 重新定时
timer = setTimeout(() => {
// fn.apply(context, args) 是 JavaScript 中的一种函数调用方式,
// 它的作用是在指定的上下文(context)中调用函数(fn),并且以数组形式传递参数(args)给该函数。
fn.apply(context,args);
},wait)
}
}
防抖Hooks
写成 Hooks 有助于提高逻辑复用性,可以使用已有的 React Hooks 来进行状态管理
// useDebounce.tsx
export default function useDebounce(fn,wait){
const [timer,setTimer] = useState(null)
return function(...args){
if(timer){
clearTimeout(timer)
}
const newTimer = setTimeout(() => {
fn(...args);
}, wait);
setTimer(newTimer);
}
}
// test.tsx
function test(){
const debounce = useDebounce(myAction,1000);
function myAction(){
// 执行逻辑
}
return <button onClick={debounce}>
Click me
</button>
}
节流函数
function throttle(fn,wait){
var preTime = Date.now()
return function(){
var context = this,
args = [...arguments],
nowTime = Date.now()
if(nowTime - preTime >= wait) {
preTime = Date.now()
return fn.apply(context,args)
}
}
}
节流Hooks
export default function useThrottle(fn,wait){
const [preTime,setPreTime] = useState(Date.now())
return function(...args){
var args = [...arguments],
nowTime = Date.now()
if(nowTime - preTime >= wait) {
setPreTime(nowTime)
return fn(...args)
}
}
}