MST

星途 面试题库

面试题:React手势识别中的防抖与节流应用

在React进行手势识别时,比如识别连续的点击手势,为了避免短时间内频繁触发事件导致性能问题,需要应用防抖或节流技术。请阐述防抖和节流的区别,并以实现一个连续点击两次触发特定函数的功能为例,给出使用防抖或节流的代码实现(二选一)。
32.0万 热度难度
前端开发React

知识考点

AI 面试

面试题答案

一键面试

防抖和节流的区别

  1. 防抖(Debounce)
    • 原理:当持续触发事件时,一定时间内没有再触发事件,事件处理函数才会执行。如果在这个设定的时间内又触发了事件,就重新开始计时。
    • 应用场景:适用于一些需要频繁触发,但不需要每次都执行的操作,比如搜索框输入时实时搜索,只有用户停止输入一段时间后才发起搜索请求,避免频繁请求服务器。
  2. 节流(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;

在上述代码中:

  1. debounce函数实现了防抖逻辑,接受一个函数func和延迟时间delay。每次触发事件时,清除之前的定时器并重新设置一个新的定时器,只有在延迟时间内没有再次触发事件,才会执行传入的函数func
  2. DebounceDoubleClick组件中,使用useState来记录点击次数clickCount。每次点击按钮,clickCount加1 ,当clickCount为1时,调用防抖后的debouncedDoubleClick函数。如果clickCount达到2 ,则重置clickCount为0,准备下一次连续点击的计数。