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;

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

相关推荐
天天进步201514 分钟前
Web应用中的CSRF防护机制
前端·网络·csrf
风清云淡_A33 分钟前
【原生js案例】移动端如何实现页面的入场和出场动画
前端·javascript
南星媛1 小时前
函数式组件使用场景和原理?
前端
一叶茶1 小时前
前端生成docx文档、excel表格、图片、pdf文件
前端·javascript·react
rkmhr_sef1 小时前
二、Jmeter Web压测
前端·jmeter
小马超会养兔子1 小时前
如何写一个转盘
开发语言·前端·vue
m0_748232921 小时前
前端在WebSocket中加入Token
前端·websocket·网络协议
等一场春雨1 小时前
react websocket 全局访问和响应
前端·websocket·react.js
fxshy1 小时前
element table 表头header-cell-style设置的表头不生效
前端·javascript·vue.js
m0_548503032 小时前
智谱BigModel研习社|搭建 AI 搜索引擎 - 使用免费的Web-Search-Pro+脑图Agent智能体
前端·人工智能·搜索引擎