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;

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

相关推荐
G***E3161 分钟前
前端技术的下一场深变:从工程化到智能化的全面升级
前端
前端小端长1 分钟前
深入理解Composition API与Vue3.0响应式原理
开发语言·javascript
哆啦A梦15889 小时前
商城后台管理系统 03 登录布局
javascript·vue.js·elementui
曼巴UE59 小时前
UE FString, FName ,FText 三者转换,再次学习,官方文档理解
服务器·前端·javascript
selt7919 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
行走的陀螺仪10 小时前
高级前端 Input 公共组件设计方案(Vue3 + TypeScript)
前端·javascript·typescript·vue·组件设计方案
一颗不甘坠落的流星10 小时前
【Antd】基于 Upload 组件,导入Json文件并转换为Json数据
前端·javascript·json
LYFlied10 小时前
Vue2 与 Vue3 虚拟DOM更新原理深度解析
前端·javascript·vue.js·虚拟dom
Lucky_Turtle10 小时前
【Node】npm install报错npm error Cannot read properties of null (reading ‘matches‘)
前端·npm·node.js