面试题答案
一键面试防抖和节流的区别
- 防抖(Debounce):
- 原理:当持续触发事件时,一定时间内没有再触发事件,事件处理函数才会执行。如果在这个设定的时间内又触发了事件,就重新开始计时。
- 应用场景:适用于一些需要频繁触发,但不需要每次都执行的操作,比如搜索框输入时实时搜索,只有用户停止输入一段时间后才发起搜索请求,避免频繁请求服务器。
- 节流(Throttle):
- 原理:规定在一个单位时间内,只能触发一次事件。无论在这个单位时间内触发了多少次事件,只有一次会生效。
- 应用场景:适用于一些需要频繁触发,但又要控制执行频率的场景,比如滚动条滚动事件,固定时间内只执行一次相关操作,避免频繁计算位置等操作导致性能问题。
使用防抖实现连续点击两次触发特定函数的代码示例
import React, { useState } from'react';
const debounce = (func, delay) => {
let timer;
return function() {
const context = this;
const args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
};
const handleDoubleClick = () => {
console.log('Double click detected!');
};
const DebounceDoubleClick = () => {
const [clickCount, setClickCount] = useState(0);
const debouncedDoubleClick = debounce(handleDoubleClick, 300);
const handleClick = () => {
setClickCount(clickCount + 1);
if (clickCount === 1) {
debouncedDoubleClick();
}
if (clickCount >= 2) {
setClickCount(0);
}
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default DebounceDoubleClick;
在上述代码中:
debounce
函数实现了防抖逻辑,接受一个函数func
和延迟时间delay
。每次触发事件时,清除之前的定时器并重新设置一个新的定时器,只有在延迟时间内没有再次触发事件,才会执行传入的函数func
。- 在
DebounceDoubleClick
组件中,使用useState
来记录点击次数clickCount
。每次点击按钮,clickCount
加1 ,当clickCount
为1时,调用防抖后的debouncedDoubleClick
函数。如果clickCount
达到2 ,则重置clickCount
为0,准备下一次连续点击的计数。