当前位置: 首页 > 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的示例
  • 早睡1小时,变化有多惊人?第一个就没想到
  • 朝鲜证实出兵俄罗斯协助收复库尔斯克
  • 上海首个航空前置货站落户松江综合保税区,通关效率可提升30%
  • 独家丨申万宏源研究所将迎来新所长:首席策略分析师王胜升任
  • 孟泽:我们简化了历史,因此也简化了人性
  • 印方称与巴基斯坦军队在克什米尔交火