react 封装防抖

封装防抖

javascript 复制代码
import React, { useRef, useEffect, useCallback } from 'react';
 
function useDebounce(fn, delay) {
  const delayRef = useRef(delay);
  const fnRef = useRef(fn);
 
  // 更新ref值
  useEffect(() => {
    delayRef.current = delay;
  }, [delay]);
 
  useEffect(() => {
    fnRef.current = fn;
  }, [fn]);
 
  const debounced = useRef();
 
  // 防抖函数
  const debounce = useCallback((...args) => {
    const later = () => {
      debounced.current = null;
    };
 
    clearTimeout(debounced.current);
    debounced.current = setTimeout(() => {
      fnRef.current(...args);
      later();
    }, delayRef.current);
  }, []);
 
  useEffect(
    () => () => {
      clearTimeout(debounced.current);
    },
    []
  );
 
  return debounce;
}
 
export default useDebounce;

使用方法

javascript 复制代码
import React, { useState } from 'react';
import useDebounce from './useDebounce';
 
const MyComponent = () => { 
  // 创建防抖函数
  const debouncedHandleChange = useDebounce(() => {
    console.log('防抖触发了');
  }, 500);
 
  return (
    <input
      type="text"
      value={value}
      onChange={(e) => {
        debouncedHandleChange(e);
      }}
    />
  );
};
 
export default MyComponent;

注:本人前端小白 ,如有不对的地方还请多多指教

相关推荐
emmm45910 分钟前
前端中常用的几种单位写法及其解释
前端
jjw_zyfx10 分钟前
vue2中 vue-count-to组件让数字从某个数字动态的显示到某个数字(后附vue3的用法)
javascript·vue.js·ecmascript
黄毛火烧雪下27 分钟前
HTML 之 <div> 和 <span>
前端·html
小林熬夜学编程29 分钟前
【Linux系统编程】第三十弹---软硬链接与动静态库的深入探索
服务器·c语言·开发语言·前端·c++·算法
2401_8572979137 分钟前
招联金融校招内推2025
java·前端·算法·金融·求职招聘
前端郭德纲38 分钟前
HTML该如何性能优化?
前端·性能优化·html
pink大呲花1 小时前
css如何制作瀑布流
前端·css
小小李程序员1 小时前
CSS3旋转、平移、缩放、倾斜
前端·css·css3
VaporGas1 小时前
SpringMVC Controller返回值技巧:ModelAndView vs String的实战对比
java·开发语言·前端·spring·springmvc·modelandview
裴嘉靖1 小时前
JavaScript中引用数据类型的浅拷贝
前端·javascript