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;

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

相关推荐
Data analyse4562 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai3 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记3 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁4 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu4 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!4 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格4 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人4 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid4 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet
IT_陈寒4 小时前
Python多进程共享变量这个坑,差点让我加班到凌晨
前端·人工智能·后端