uni-app 微信小程序 真机苹果下 map markers标签,只要改变某个属性其他markers标签会全部消失
uni-app 微信小程序 真机苹果下 map markers标签,只要改变某个属性其他markers标签会全部消失 产品分类:
- uniapp/小程序/微信
PC开发环境操作系统:
- Windows
PC开发环境操作系统版本号:
- Win10
HBuilderX类型:
- 正式
HBuilderX版本号:
- 3.2.3
第三方开发者工具版本号:
- 1.05.2108130
基础库版本号:
- 2.18.0
项目创建方式:
- HBuilderX
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | Win10 | HBuilderX |
示例代码:
//地图标签
id="myMap"
ref="myMap"
show-location
scale="16"
:markers="markers"
:longitude="longitude"
:latitude="latitude"
:controls="controls"
@markertap="clickMarker"
:style="{ height: mapHeight, width: mapWidth }"
//标签赋值
data() {
return {
longitude: '',
latitude: '',
markers: []
}
}
onShow: function() {
//后端加载附近资源资源(这边直接简写结果)
this.markers = [{
height: 25
iconPath: "https://xxx/park-addresss-icon.png"
id: 134.323437
latitude: 28.895885
longitude: 105.427552
width: 21
},{
height: 25
iconPath: "https://xxx/park-addresss-icon.png"
id: 134.324332
latitude: 28.897056
longitude: 105.427276
width: 21
} ... ];
// 大概有140个左右的标签
}
//点击标签方法
clickMarker(e) {
const markerId = e.detail.markerId;
for (let i = 0; i < this.markers.length; i++) {
let item = this.markers[i];
if(markerId === item.id) {
// 标签变大
this.$set(this.markers, i, Object.assign(item, {
width: 38,
height: 44
}));
}
}
}
操作步骤:
上面描述
预期结果:
上面描述
实际结果:
上面描述
bug描述:
需求是点击某个标签选中变大
问题是点击标签marker,点击的标签不消失,其他标签全消失了
微信开发者工具上没有问题,在苹果真机上就会出现问题,测试过苹果8、xs均会
Android机下不会存在问题,测试过华为荣耀小米
是使用姿势不对吗
各位大神帮忙看看是什么原因,小弟不胜感激,下面贴简化代码,真是代码太长太多
更多关于uni-app 微信小程序 真机苹果下 map markers标签,只要改变某个属性其他markers标签会全部消失的实战教程也可以访问 https://www.itying.com/category-93-b0.html
解决了,没点人品真解决不了。。。
更多关于uni-app 微信小程序 真机苹果下 map markers标签,只要改变某个属性其他markers标签会全部消失的实战教程也可以访问 https://www.itying.com/category-93-b0.html
请问怎么解决的呢?遇到点击后都不显示了
markers里面的id不要有小数点,不要是字符串,一定要整数
这是一个已知的 uni-app 在 iOS 真机上处理 map 组件 markers 更新的性能优化问题。问题核心在于:iOS 微信小程序底层对 markers 数组的更新采用了差异化对比更新策略,但在某些情况下会错误地判断为需要清空其他 markers。
问题分析
-
根本原因:iOS 微信小程序在更新 markers 时,会对比新旧数组的引用和内容。当使用
this.$set或直接修改数组元素时,如果新旧数组的id字段或其他关键属性发生变化,iOS 端可能会错误地认为需要重新渲染整个 markers 集合,导致未修改的 markers 消失。 -
Android 正常的原因:Android 端的实现机制不同,对 markers 的更新处理更加宽松,不会出现此问题。
解决方案
方案一:使用全新的 markers 数组(推荐)
修改 clickMarker 方法,创建全新的 markers 数组:
clickMarker(e) {
const markerId = e.detail.markerId;
const newMarkers = this.markers.map(item => {
if (markerId === item.id) {
return {
...item,
width: 38,
height: 44
};
}
return { ...item }; // 创建新对象,保持引用不同
});
this.markers = newMarkers;
}
方案二:使用深度拷贝确保引用不同
clickMarker(e) {
const markerId = e.detail.markerId;
const updatedMarkers = JSON.parse(JSON.stringify(this.markers));
for (let i = 0; i < updatedMarkers.length; i++) {
if (markerId === updatedMarkers[i].id) {
updatedMarkers[i].width = 38;
updatedMarkers[i].height = 44;
break;
}
}
this.markers = updatedMarkers;
}
方案三:使用 callout 替代 markers 尺寸变化
如果只是需要视觉上的选中效果,可以考虑使用 callout(标注)来显示选中状态,而不是改变 marker 的尺寸:
// 在 marker 数据中添加 callout
clickMarker(e) {
const markerId = e.detail.markerId;
const newMarkers = this.markers.map(item => {
if (markerId === item.id) {
return {
...item,
callout: {
content: '已选中',
color: '#ffffff',
bgColor: '#007AFF',
padding: 5,
borderRadius: 3,
display: 'ALWAYS'
}
};
}
return {
...item,
callout: null // 清空其他 callout
};
});
this.markers = newMarkers;
}

