React 自定义 Hook 实现鼠标左键长按触发(含源码)
在 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;
};
📌 这里
useMouseDown
和useMouseUp
是自定义 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