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

如何在use-gesture/react中使用右键点击事件?绑定后鼠标事件异常问题

解决react-use-gesture bind覆盖Mesh的mousedown事件及多按键响应问题

核心问题原因

react-use-gesture的bind函数会接管目标元素的鼠标事件(包括mousedown),导致单独添加的mousedown事件无法触发;同时默认仅监听左键点击(button: 0),右键/中键不会响应。


解决方案

1. 让use-gesture响应所有鼠标按键

在useGesture的配置项中设置button: null,使其监听所有鼠标按键的事件:

import { useGesture } from 'react-use-gesture';

const YourMeshComponent = () => {
  const bind = useGesture(
    {
      // 统一处理所有鼠标按下逻辑
      onMouseDown: ({ event }) => {
        // 通过button值区分按键:0=左键,1=中键,2=右键
        switch (event.button) {
          case 0:
            // 左键逻辑,保留原手势功能(如拖拽、旋转)
            console.log('左键点击Mesh,执行手势操作');
            break;
          case 2:
            // 右键逻辑,需阻止默认右键菜单
            event.preventDefault();
            console.log('右键点击Mesh,执行自定义操作');
            break;
          case 1:
            // 中键逻辑
            console.log('中键点击Mesh');
            break;
        }
      },
      // 其他手势回调示例(比如拖拽)
      onDrag: ({ offset }) => {
        // 处理Mesh拖拽逻辑
      }
    },
    {
      button: null // 关键配置:监听所有鼠标按键
    }
  );

  // 将bind绑定到Mesh组件
  return <mesh {...bind()}>
    {/* 此处添加Mesh的几何体、材质等 */}
  </mesh>;
};

2. 避免单独添加mousedown事件

不要给Mesh单独绑定onMouseDown属性,因为bind()已经接管了事件处理,单独添加的事件会被覆盖。所有鼠标按下逻辑都应放在useGesture的onMouseDown回调中统一处理。

3. 检查Mesh的交互状态(Three.js场景)

如果使用Three.js或@react-three/fiber:

  • @react-three/fiber的Mesh默认可交互,若手动关闭过需设置interactive={true}
  • 原生Three.js需确保mesh.userData.interactive = true,且场景配置了Raycaster用于交互检测

内容的提问来源于stack exchange,提问作者jsc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:21:18