@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
相关产品推荐
相关产品推荐

