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

合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上定制,此处就不再赘述。

相关文章:

  • 相对路径跳转和绝对路径跳转有什么区别?
  • Vue3一个组件绑定多个 v-model,自定义 prop 和 event 名称
  • 【区块链 + 金融服务】寿险业直保再保协同平台 | FISCO BCOS 应用案例
  • 【计算机网络】一二章
  • java面试题之多线程
  • 怎么鉴别金媒v10.51和v10.5的区别!单单从CRM上区分!
  • Git 新建本地分支并关联到远程仓库
  • 在制作电脑的过程中,如何区分整机性能问题和应用自身性能问题
  • 【2025 最新 Cursor AI 教程 05】用 Cursor AI 解决常见开发问题
  • SpringMVC-登录校验
  • 【Leetcode】328. 奇偶链表
  • element-ui progress 组件源码分享
  • 初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
  • vue中js简单创建一个事件中心/中间件/eventBus
  • P1591 阶乘数码
  • BFS,DFS带图详解+蓝桥杯算法题+经典例题
  • 如何在前端发版时实现向客户端推送版本更新消息
  • Java Date 判断两个Date范围在第几季度
  • 使用 Path 对象来定义路径
  • 在Vue3中使用Echarts的示例
  • 贵州省总工会党组成员、副主席梁伟接受审查调查
  • 巴基斯坦称回应挑衅,对印度发起军事行动
  • 工行回应两售出金条发现疑似杂质:情况不属实,疑似杂质应为金条售出后的外部附着物
  • 追光|铁皮房、土操场,这有一座“筑梦”摔跤馆
  • 明星站台“胖都来”背后:百元起录视频,20万可请顶流
  • 上海营商环境的“分寸”感:底线之上不断拓宽自由,底线之下雷霆制止