show-location不是全局开关,仅控制原生图钉显示且h5不支持;真正导致残留定位图标的是手动添加的markers中包含当前定位点,需过滤该marker并清空include-points等潜在触发源。

uni-app 的 show-location 属性不是“开关”,而是“平台兼容性开关”
直接设 show-location="false" 看似合理,但实际在 H5 端无效(该属性 H5 完全不支持),在微信小程序和 App 端也仅控制原生定位图钉的显示,**不控制你手动添加的 markers 中的定位标记**。很多人以为关掉它就干净了,结果地图上还飘着一个红色图钉——那其实是你自己用 markers 渲染的,跟 show-location 无关。
真正要去掉的,是你自己加的定位 marker
绝大多数“去不掉的当前位置图标”,根源在于代码里显式写了定位点 marker:
- 比如
markers: [{ id: 1, latitude, longitude, iconPath: '...' }]这种写法,只要数组里有这个对象,图标就一定显示 - 即使你没写
iconPath,uni-app 会 fallback 到默认红色图钉 - 如果用了
callout或label,还会附带气泡或文字标签,更难忽略
解决办法很简单:清空或过滤掉 markers 数组中代表“当前位置”的那一项。例如:
const currentPosMarker = { id: 'current', latitude, longitude }
this.markers = this.markers.filter(m => m.id !== 'current')
Android/iOS/微信小程序对原生定位图钉的处理差异
即使你没手动加 marker,show-location="true" 在不同端表现也不一致:
- 微信小程序:显示带方向箭头的蓝色图钉(不可自定义样式)
- App 端(uni-app-plus):显示原生系统定位图标,样式由系统决定,且可能随高德/腾讯 SDK 版本变化
- H5:完全无视
show-location,既不报错也不渲染——所以你以为关了,其实它本来就没开
如果你的目标是“全平台统一隐藏”,唯一可靠方式是:始终设 show-location="false",并确保 markers 数组里不包含当前定位点。
容易被忽略的“残留图钉”来源:map 组件的 include-points 或缓存
有时候清空了 markers、关掉了 show-location,地图仍短暂闪现一下定位图标——这通常是以下原因:
-
include-points传入了当前坐标数组,某些平台(尤其 iOS App)会据此自动触发一次中心定位动画,连带唤起原生定位图钉 - 页面未销毁,map 组件复用时保留了上一次的 state(比如从定位页跳转回来,map 实例没重建)
- 在
@regionchange回调里又偷偷重置了 markers,形成“刚删完又加回来”的循环
检查点:删掉所有 include-points 相关逻辑;在 onUnload 或 onHide 里重置 markers = [];避免在 @regionchange 中无条件更新 markers。











