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

@react-google-maps/api中Polygon组件右键点击时如何屏蔽onMouseUp?

解决@react-google-maps/api中Polygon右键点击触发onMouseUp的问题

这个问题其实是浏览器原生事件机制导致的——右键点击操作本身会先触发mouseup事件,再触发contextmenu(对应组件的onRightClick)事件。咱们可以通过事件对象的属性来区分这两种场景,下面给你两种可行的方案:

方案一:在事件回调中直接过滤右键触发的情况

最直接的方式是利用鼠标事件的button属性区分按键:右键对应的button值为2,左键为0。我们可以在onMouseUp回调或统一的处理函数里过滤掉右键触发的mouseup事件:

方式1:在onMouseUp中直接过滤

const onMouseUp = useCallback((e: any) => {
  // 过滤右键触发的mouseup事件
  if (e.button === 2) return;
  handleChange(e, "mouse_up");
}, [handleChange]);

方式2:在统一处理函数中过滤

如果希望逻辑更集中,也可以在handleChange里统一判断:

function handleChange(e: any, type: CallbackType) {
  // 若为mouse_up且是右键触发,直接跳过
  if (type === "mouse_up" && e.button === 2) return;
  setCallback(type);
}

方案二:利用事件触发顺序做状态标记

右键点击的事件顺序是mousedown → mouseup → contextmenu(即onRightClick),我们可以通过状态标记是否触发了右键,从而跳过对应的mouseup处理:

function useEventCallback(onChange: (type: CallbackType) => void) {
  const [currentCallback, setCallback] = useState<CallbackType>();
  const [isRightClickTriggered, setIsRightClickTriggered] = useState(false);

  const onRightClick = useCallback((e: any) => {
    setIsRightClickTriggered(true);
    handleChange(e, "right_click");
    // 异步重置标记,避免影响后续左键操作
    setTimeout(() => setIsRightClickTriggered(false), 0);
  }, []);

  const onMouseUp = useCallback((e: any) => {
    // 如果是右键触发的场景,跳过mouseup处理
    if (isRightClickTriggered) return;
    handleChange(e, "mouse_up");
  }, [isRightClickTriggered]);

  // 其余onDblClick、handleChange逻辑保持不变
  const onDblClick = useCallback((e: any) => handleChange(e, "double_click"), [handleChange]);
  
  return { onRightClick, onMouseUp, onDblClick };
}

另外,你原代码里通过setTimeout和currentCallback中转事件的逻辑,可以优化得更简洁——直接在handleChange里调用传入的onChange回调即可,省去状态和定时器的开销:

function useEventCallback(onChange: (type: CallbackType) => void) {
  function handleChange(e: any, type: CallbackType) {
    if (type === "mouse_up" && e.button === 2) return;
    onChange(type);
  }

  const onMouseUp = useCallback((e: any) => handleChange(e, "mouse_up"), []);
  const onDblClick = useCallback((e: any) => handleChange(e, "double_click"), []);
  const onRightClick = useCallback((e: any) => handleChange(e, "right_click"), []);

  return { onRightClick, onMouseUp, onDblClick };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:22:51