You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于useEffect实现的useDebounce出现内存泄漏警告如何处理

React useDebounce 防抖Hook内存泄漏修复方案

修改后的完整代码如下:

import { useEffect, useRef } from 'react';

function useDebounce(value, cost, fn, delay) {
  // 追踪组件挂载状态
  const isMounted = useRef(true);

  useEffect(() => {
    // cost不存在时直接跳过定时器创建
    if (!cost) return;

    const handler = setTimeout(() => {
      // 仅组件未卸载且cost存在时执行目标函数
      if (isMounted.current && cost) {
        fn();
      }
    }, delay);

    // 依赖变化/组件卸载时清除定时器
    return () => {
      clearTimeout(handler);
    };
  }, [value, cost, fn, delay]);

  // 组件卸载时更新挂载标记
  useEffect(() => {
    return () => {
      isMounted.current = false;
    };
  }, []);
}

核心调整点

  • 新增isMounted ref标记组件生命周期状态,组件卸载时自动更新为false,定时器回调执行前先校验该标记,彻底避免已卸载组件执行状态更新逻辑,消除内存泄漏警告
  • 增加cost状态校验逻辑:定时器创建前先判断cost是否存在,不存在直接跳过防抖逻辑;回调触发时二次校验cost状态,只有存在时才执行目标函数
  • 补全useEffect依赖数组,将所有外部传入的可变参数全部加入依赖,避免闭包捕获旧值导致的逻辑异常

注意:调用侧传入的fn函数建议使用useCallback包裹,避免函数引用频繁变化导致防抖逻辑失效。

内容的提问来源于stack exchange,提问作者Mr.Kurosava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:36:01