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

Mapbox GL JS调用map.off移除mousemove事件监听不生效如何解决

问题根因

事件解绑失效的核心原因是:你传入map.on和map.off的回调函数不是同一个引用。
你写的(event) => handlerValues(event)属于内联匿名箭头函数,每次代码执行都会生成一个全新的函数实例。哪怕你已经用useCallback缓存了内部的handlerValues,外层这层匿名函数每次都是新创建的,地图的事件系统匹配不到之前绑定的回调引用,自然无法完成移除。
另外这层匿名包裹函数本身是完全冗余的:事件触发时,event对象本来就会作为第一个参数默认传入绑定的回调函数,不需要你手动透传。

修复方案

直接把你用useCallback缓存好的handlerValues作为回调传给绑定、解绑方法即可,不需要额外套箭头函数:

// 绑定事件
map.on('mousemove', handlerValues)

// 解绑事件
map.off('mousemove', handlerValues)

这种写法下,缓存后的handlerValues引用全程稳定,on和off拿到的是完全相同的函数,解绑会正常生效,函数内也可以正常接收到event事件对象。

如果你确实需要给handlerValues传入额外的自定义参数,不能直接写内联箭头函数,需要把包装后的回调也做引用缓存,比如用useRef存储:

const handlerRef = useRef()
// 把包装后的回调存在ref上,保证引用一致
handlerRef.current = (event) => handlerValues(event, yourCustomParams)

// 绑定
map.on('mousemove', handlerRef.current)
// 解绑
map.off('mousemove', handlerRef.current)

内容的提问来源于stack exchange,提问作者Рома Федоров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:36:37