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;

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

相关推荐
We་ct30 分钟前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
陈随易4 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·后端·程序员
冰暮流星5 小时前
javascript之事件代理/事件委托
前端
陈随易6 小时前
AI时代,你还在坚持手搓文章吗
前端·后端·程序员
里欧跑得慢8 小时前
17. Flutter Hero动画实现:让界面过渡更加优雅
前端·css·flutter·web
IT_陈寒8 小时前
Vue的这个响应式陷阱,我debug了一整天才爬出来
前端·人工智能·后端
cn_mengbei9 小时前
用React Native开发OpenHarmony应用:Reanimated共享元素过渡
javascript·react native·react.js
kyriewen9 小时前
前端测试:别为了100%覆盖率而写测试,那是自欺欺人
前端·javascript·单元测试
去伪存真9 小时前
我自己写的第一个skills--project-core-standards
前端·agent
Data_Journal9 小时前
如何使用cURL更改User Agent
大数据·服务器·前端·javascript·数据库