当前位置: 首页 > article >正文

合React宝宝体质的自定义防抖hook

本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~

具体博文介绍:
开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘金

为什么不推荐使用第三方库实现节流函数?

像节流防抖这类易实现的函数推荐手写而不使用库函数,为什么现在支持Tree Shaking按需引入还需要手写?因为可以根据实际情况高度定制和简化代码(体积更小)以及性能优化,当然手写不易实现的功能还是需要使用第三方库,所以我推荐采用混合策略:核心路径代码手写优化 + 复杂功能使用高质量小型库。

纯js实现一个基础防抖函数
function debounce(fn, delay) {
  let timer = null;
  const _debounce = function (...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
  return _debounce;
}

react实现一个基础防抖函数
import {useCallback, useRef} from "react";

export function useDebounce<
  T extends (...args: Parameters<T>) => ReturnType<T>,
>(callback: T, delay: number = 500) {
  const timeoutRef = useRef<NodeJS.Timeout>();

  return useCallback((...args: Parameters<T>) => {
    if (timeoutRef.current) {
      clearTimeout(timeoutRef.current);
    }
    
    timeoutRef.current = setTimeout(() => {
      callback(...args);
    }, delay);
  }, [callback, delay]);
}

总结

React 版本的防抖钩子通过 useCallback 保持函数引用稳定避免子组件无效渲染,依赖数组自动更新最新回调函数和延迟参数,集成 React 生命周期自动清理定时器,配合 TypeScript 泛型保留完整类型提示,完美适配函数组件开发模式,从根本上解决了普通防抖函数在 React 中容易产生的闭包陷阱和内存泄漏问题。

以上demo都为基础版本,可以根据具体需求在demo上定制,此处就不再赘述。


http://www.kler.cn/a/591782.html

相关文章:

  • 安全地自动重新启动 Windows 资源管理器Bat脚本
  • css3有哪些新属性
  • 计算机网络-综合布线系统
  • trae和Spring Boot Java 项目 ruoyi框架
  • STM32---FreeRTOS软件定时器
  • 关于非线性优化小记
  • 半导体制造行业的现状 内检LIMS系统在半导体制造的应用
  • Spring Cloud 中的服务注册与发现: Eureka详解
  • mybatis集合映射association与collection
  • WebForms HTML:深入理解与高效应用
  • RS-232与TTL、CMOS的区别
  • 软件工程:数据字典
  • Spring Bean 生命周期深度解析:原理、场景与优化策略
  • Java List 接口的核心 API
  • 【区块链+乡村振兴】国经安农信链服务平台 | FISCO BCOS 应用案例
  • HarmonyOS三层架构实战
  • 算法刷题记录——LeetCode篇(6) [第501~600题](持续更新)
  • 前端安全之DOMPurify基础使用
  • pytorch小记(十三):pytorch中`nn.ModuleList` 详解
  • 【华为OD-E卷 - 单词接龙 100分(python、java、c++、js、c)】