微信小程序 map 组件必须启用原生渲染模式,关键为设置 style="width: 100%; height: 100%;" 且 marker 图标路径用本地相对路径、坐标统一为 gcj-02、id 为数字并深拷贝更新。

微信小程序里用 map 组件做静态地图展示,不是“放张图”那么简单——真机上 marker 不显示、点击没反应、缩放卡顿,基本都是因为没走原生渲染路径。必须用微信原生 map,不能靠 H5 模拟或 cover-view 堆砌。
微信小程序必须启用原生 map 渲染模式
uni-app 的 map 在微信平台下只有设成原生层才真正可用。关键就两件事:style="width: 100%; height: 100%;" + platform="weixin"(后者在微信环境自动生效,但 style 缺一不可)。
- 不写 width/height 或只写固定 rpx 值(如
height: 400rpx),会导致 marker 渲染失败或事件丢失 - 加了
custom-style或试图用 canvas 渲染,直接被忽略——微信原生 map 不支持这些 - H5 或 App 端调试正常,切到小程序真机就全黑?大概率是样式没撑满容器,或者用了 cover-view 套在 map 里面
marker 图标路径必须是本地相对路径且去根斜杠
微信小程序沙箱机制不允许直接访问 /static/icon.png 这类带开头斜杠的路径。开发工具能显示,真机必挂。
- 正确写法:
iconPath: 'static/images/marker.png'(去掉开头/) - 网络图片要加到微信公众平台「业务域名」白名单,否则加载失败且无报错
- 图标尺寸建议控制在 30×30 rpx 内,太大拖慢渲染;宽高必须显式声明,否则部分机型默认为 0
坐标系必须统一为 GCJ-02,且 uni.getLocation type 不能选 wgs84
微信原生 map 只认 GCJ-02 坐标。用高德/百度 API 查附近门店返回的 WGS-84 坐标,直接喂进去会偏移 300–500 米。
- 获取用户位置必须用:
uni.getLocation({ type: 'gcj02' })——type: 'wgs84'在真机上常为空或严重偏差 - 后端查周边数据若来自高德,得先调其坐标转换接口
https://restapi.amap.com/v3/conv/coord,把 WGS-84 转 GCJ-02 再传给前端 - 腾讯地图 API(如周边搜索)返回的就是 GCJ-02,可直连,省一步转换
动态更新 markers 时 id 必须是数字,且每次 setData 前需深拷贝
微信原生 map 对 markers 数组内部引用极其敏感。浅拷贝或复用同一数组引用,会导致 marker 刷新失效或点击响应错乱。
-
id字段必须是整数(如store.id),字符串 ID("store_123")在 iOS 上 markertap 事件大概率不触发 - 更新前务必:
markers.value = JSON.parse(JSON.stringify(newMarkers)),绕过 Vue 响应式劫持导致的引用缓存 - 每个 marker 对象只保留必要字段(
id、latitude、longitude、iconPath),别塞整个门店对象,否则超过 10 个 marker 就明显卡顿
最易被忽略的是:所有 cover-view/cover-image 必须写在 map 标签外部,用 @markertap 关联点击逻辑,而不是往 map 里面嵌套。这点在文档里藏得深,但真机上 marker 消失的第一排查点就是它。









