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;

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

相关推荐
Pedantic4 分钟前
swift 日期与时间的三个结构体
前端
南方kenny4 分钟前
Mock.js:前端开发的假数据神器
前端·javascript
芹丸子4 分钟前
vue cli 创建项目一直失败
前端
鹏程十八少9 分钟前
6.android Vivo手机 指纹解锁动画 (附源码)
前端
AliciaIr9 分钟前
深入理解React Hook:useRef的底层机制与高级应用
前端·react.js
子林super9 分钟前
Linux下各种连接数配置及高并发Nginx优化
前端
Dream耀12 分钟前
CSS过渡 vs 动画:都有哪些技巧
前端·css
程思扬13 分钟前
无界设计新生态:Penpot开源平台与cpolar的云端协同创新实践
大数据·linux·服务器·前端·经验分享·ubuntu·开源
1024小神14 分钟前
Cocos游戏开发中,如何动态加载资源和远程资源 resources
前端·javascript
圆心角15 分钟前
浏览器垃圾回收机制-面试足够了
前端·浏览器·v8