React 自定义 Hook 实现鼠标左键长按触发(含源码)

望舒的头像
望舒
标签:
reacthooks鼠标左键长按

在 React 应用中,我们常常需要(例如实现长按连续触发、拖拽、游戏蓄力或绘图场景)。

本文将分享一个简单又强大的自定义 Hook —— useMouseDownAndHold,它能够监听鼠标左键按下后持续触发回调函数,并支持自定义触发间隔(delay)。

✨ 功能简介

  • 监听鼠标左键按下
  • 长按时每隔 delay 毫秒触发一次回调
  • 鼠标抬起时自动停止触发
  • 使用简单,适合各种交互场景

🧩 示例源码

下面是完整实现代码:

复制
import { useRef, useCallback } from "react";
import { useMouseDown, useMouseUp } from "./yourHooksPath";

export const useMouseDownAndHold = (fn: () => void, delay: number = 100) => {
  const timer = useRef<any>();

  const handleMouseDownAndHold = useCallback(() => {
    fn && fn();
  }, [fn]);

  const handleMouseDown = useCallback(() => {
    timer.current = setInterval(() => {
      handleMouseDownAndHold();
    }, delay);
  }, [delay, handleMouseDownAndHold]);

  const handleMouseUp = useCallback(() => {
    timer.current && clearInterval(timer.current);
  }, []);

  const [mouseDown, setMouseDown] = useMouseDown(handleMouseDown);
  const [mouseUp, setMouseUp] = useMouseUp(handleMouseUp);

  return [mouseDown, setMouseDown, mouseUp, setMouseUp] as const;
};

📌 这里 useMouseDownuseMouseUp 是自定义 Hook,用于监听全局鼠标事件,核心逻辑非常简单:鼠标左键按下时触发 handleMouseDown,鼠标抬起时触发 handleMouseUp

React 自定义 Hook 监听鼠标左键按下和抬起:https://blog.xn--rpv331d.com/%E6%9C%9B%E8%88%92/blog/75

🛠 使用方法示例

复制
import React from "react";
import { useMouseDownAndHold } from "./yourHooksPath";

export default function DemoComponent() {
  const [mouseDown] = useMouseDownAndHold(() => {
    console.log("鼠标长按触发一次");
  }, 200); // 每 200ms 触发一次

  return (
    <button>
      {mouseDown ? "正在长按中..." : "点击或长按"}
    </button>
  );
}

在这个示例中:

  • 当用户长按按钮时,console.log 会每 200ms 输出一次
  • 松开鼠标左键后立即停止触发

✅ 总结

通过 useMouseDownAndHold 自定义 Hook,你可以在 React 中轻松实现鼠标左键长按连续触发,非常适合需要持续触发的业务场景(例如长按加速滚动、长按绘图或游戏等)。

代码简单、复用性强,还能灵活自定义触发间隔 delay。

作者:https://blog.xn--rpv331d.com/望舒

链接:https://blog.xn--rpv331d.com/望舒/blog/76

转载注意保留文章出处...

‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌‌​‌​​‌‌‌​‌‌​‌​‌‌​‌​‌‌​‌‌‌‌‌‌​‌‌​​​​​​‌​‌​​​​‌​‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​​‌​​‌​‌‌​​​​​‌‌​​​‌​​‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​​‌​​‌​‌‌​​​​​‌‌​​​‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌​‌‌​​​‌‌​‌​‌‌‌‌​‌​​‌‌‌​​​‌‌‌​​​​​​​​​​‌​‌​​​​‌​‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​​‌​​‌​‌‌​​​​​‌‌​​​‌​​‌‌‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​​‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌​‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌​​‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌‌‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​​‌​‌‌​‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​​‌​​‌​‌‌​​​​​‌‌​​​‌​​‌‌‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌​‌‌​‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌​‌‌‌​‌‌‌​​‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌‌‌‌​‌​‌​​‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌​‌​‌‌​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌‌‌‌‌​​‌​‌​​‌​‌‌‌​‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌​‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌‌​‌​‌​​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌‌‌​​​‌‌‌​​‌‌​‌‌‌‌‌​​​​‌‌​​‌‌​​‌‌‌‌‌‌​‌‌​​​‌​‌‌​​‌​‌‌‌‌‌​‌‌​‌​​​‌‌‌​‌​​‌‌‌​‌‌​​​​​‌‌‌​​‌​‌‌‌​​​​‌‌​‌‌​‌​​‌‌​‌​​​​​‌​‌‌‌​​​​‌​‌‌​​​‌‌‌‌​‌‌​‌​​​‌​​​​‌‌‌‌​‌‌​‌‌​‌​‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌‌‌‌‌​‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌‌‌‌‌​​‌​‌‌​‌‌‌‌‌​‌‌‌​‌‌​‌​‌‌‌‌‌
No data