微信小程序 map 组件必须启用原生渲染层,使用 GCJ-02 坐标系、显式设置 latitude/longitude、绝对路径图标、数字唯一 marker id,并避免 cover-view 和 custom-style。
微信小程序里用 map 组件显示静态地图,不是“截图”或“图片”,而是原生地图渲染——但必须满足几个硬性条件,否则地图空白、marker 不见、缩放卡顿。核心就一条:**必须走微信原生 map 渲染层,不能套 cover-view,不能用 custom-style,不能混用坐标系。**
uni-app 的 map 在微信小程序平台不支持 canvas 或 custom-style 渲染。真机上 marker 消失、点击无响应、拖拽卡顿,90% 是因为没强制启用原生层。
<map :latitude="latitude" :longitude="longitude" style="width: 100%; height: 100%;"></map> —— style 里宽高缺一不可,且不能用 vh/rpx 动态计算(某些机型解析失败)custom-style,也不要用 cover-view 包裹 map 标签;所有覆盖层(如定位按钮、气泡)必须写在 map 外部,用 @markertap 或 @callouttap 关联v-if="platform === 'mp-weixin'" 隔离微信专属写法,避免 H5 端报错微信原生 map 对坐标系极其敏感。用高德 API 返回的 WGS-84 坐标直接塞进去,会偏移 300–500 米;uni.getLocation({ type: 'wgs84' }) 在真机上常返回空或偏差极大。
uni.getLocation({ type: 'gcj02' }) —— 这是微信小程序唯一稳定可靠的类型/v3/conv/coord)把结果转成 GCJ-02,再喂给 map
:latitude 和 :longitude 属性,不能只靠 show-location 自动居中(否则 marker 可能不渲染)真机上图标不显示,几乎全是路径问题。开发工具能跑 ≠ 真机能跑。
/ 开头,且文件真实存在于 static 目录下,例如:iconPath: '/static/icon-store.png'
'../static/xxx')、不能用变量拼接路径(iconPath: `${baseUrl}/store.png`)、不能用网络图(除非域名已加白名单且 HTTPS)width/height 必须显式设,否则 iOS 上可能拉伸变形微信原生 map 对 markers 数组的 id 类型和唯一性有强校验。字符串 ID(如 "store_123")在 iOS 上大概率导致 @markertap 失效;重复 ID 会让新 marker 覆盖旧的,但点击仍触发旧数据。
id 字段必须是整数,推荐直接用后端返回的主键 Number(store.id),避免拼接字符串markers 前,务必深拷贝:this.markers = JSON.parse(JSON.stringify(newMarkers)),否则微信内部引用缓存可能导致界面不刷新id、latitude、longitude、name、iconPath 等必要项最易被忽略的是:**坐标系混用 + marker id 类型错误 + 图标路径写法不规范**,这三者叠加,会导致地图在开发工具里一切正常,一到真机就全崩。调试时优先检查 console 是否报 marker not found 或 invalid coordinate,而不是反复改样式。