React 自定义 Hook 监听鼠标左键按下和抬起(含源码)

望舒的头像
望舒
标签:
reacthooks鼠标左键按下、抬起

在 React 项目中,我们经常需要监听用户的鼠标行为,比如检测左键是否按下、是否抬起,以实现拖拽、绘图或交互特效等功能。

本篇文章将通过两个简单的自定义 Hook:useMouseDownuseMouseUp,实现对鼠标左键的监听。同时还会讨论如何优化代码结构,让 Hook 更易维护和复用。

📦 1. 示例源码

下面是完整代码示例:

复制
import { useState, useCallback, useEffect } from "react";

export const useMouseDown = (fn?: () => void) => {
    const [mouseDown, setMouseDown] = useState(false);
    const handleMouseDown = useCallback((event: MouseEvent) => {
        if (event.button === 0) {
            setMouseDown(true);
            fn?.();
        }
    }, [fn]);

    useEffect(() => {
        window.addEventListener("mousedown", handleMouseDown);
        return () => window.removeEventListener("mousedown", handleMouseDown);
    }, [handleMouseDown]);

    return [mouseDown, setMouseDown] as const;
};

export const useMouseUp = (fn?: () => void) => {
    const [mouseUp, setMouseUp] = useState(false);
    const handleMouseUp = useCallback((event: MouseEvent) => {
        if (event.button === 0) {
            setMouseUp(true);
            fn?.();
        }
    }, [fn]);

    useEffect(() => {
        window.addEventListener("mouseup", handleMouseUp);
        return () => window.removeEventListener("mouseup", handleMouseUp);
    }, [handleMouseUp]);

    return [mouseUp, setMouseUp] as const;
};

🛠 2. 使用方法

只需在组件中调用:

复制
const [mouseDown] = useMouseDown(() => console.log("左键按下"));
const [mouseUp] = useMouseUp(() => console.log("左键抬起"));

✅ 总结

通过自定义 Hook,我可以轻松监听鼠标左键按下与抬起事件,减少冗余逻辑并提高代码可维护性。

相关文章

React 自定义 Hook 实现鼠标左键长按触发:https://blog.xn--rpv331d.com/%E6%9C%9B%E8%88%92/blog/76

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

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

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

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