uni-app 使用 renderjs 和 leaflet 进行地图渲染时,两级跳转pages操作后再返回地图页面,操作会变得卡顿
uni-app 使用 renderjs 和 leaflet 进行地图渲染时,两级跳转pages操作后再返回地图页面,操作会变得卡顿
操作步骤
地图tabbar页面切换到其他页面,navigateTo进入到三级页面,再返回切换至地图页面;地图和dom操作卡顿
预期结果
切换到二级、三级页面流畅
实际结果
地图和dom操作卡顿
bug描述
uniapp 使用 renderjs 和 leaflet 进行地图渲染,两级跳转pages操作后,再返回到地图页面,操作会变得卡顿; 一级跳转页面时不会特别卡顿,两级时会卡
开发环境及项目信息
项目创建方式 | PC开发环境操作系统 | PC开发环境操作系统版本号 | HBuilderX类型 | HBuilderX版本号 | 手机系统 | 手机系统版本号 | 手机厂商 | 手机机型 | 页面类型 | vue版本 | 打包方式 |
---|---|---|---|---|---|---|---|---|---|---|---|
HBuilderX | Windows | windows 11 | Alpha | 4.45 | Android | Android 13 | 华为 | Mate 30 | vue | vue3 | 云端 |
2 回复
你也提到了卡,是否有监听、销毁的操作?提供个简单的复现工程。
在uni-app中使用renderjs
和leaflet
进行地图渲染时,如果遇到在两级跳转页面后返回地图页面导致操作卡顿的问题,可能是由于页面状态未正确恢复或者资源未有效管理导致。以下是一个简化的代码示例,展示如何在renderjs
中管理Leaflet地图实例,并尝试解决返回页面时的卡顿问题。
1. 页面结构 (pages/map/map.vue)
<template>
<view class="container">
<view id="map" style="width: 100%; height: 100%;"></view>
</view>
</template>
<script>
export default {
onReady() {
this.$nextTick(() => {
// 初始化 renderjs
this.$mp.page.setData({
renderScript: `
const mapContainer = document.getElementById('map');
let map;
export function initMap() {
if (map) {
map.remove(); // 清理之前的地图实例
}
map = L.map(mapContainer).setView([51.505, -0.09], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
}
export function onShow() {
initMap(); // 页面显示时重新初始化地图
}
`
});
// 触发 renderjs 中的 onShow 函数
this.$mp.page.callMethod('onShow');
});
},
onUnload() {
// 页面卸载时,可以通过 renderjs 清理资源(这里示例未直接使用,因为 renderjs 有自己的生命周期管理)
// 但可以在 renderjs 中添加逻辑来响应此事件进行资源清理
}
};
</script>
<style>
.container {
width: 100%;
height: 100%;
}
</style>
2. 使用 renderjs 生命周期管理
在上面的代码中,我们通过renderScript
定义了initMap
和onShow
函数。initMap
负责初始化地图,并在每次调用时清理之前的地图实例,避免内存泄漏。onShow
是在页面显示时被调用的函数,用于重新初始化地图。
注意事项
- 资源管理:确保在
onUnload
或适当的生命周期钩子中清理地图实例和其他资源,虽然renderjs
有自己的垃圾回收机制,但显式清理可以避免潜在问题。 - 性能优化:如果地图数据复杂,考虑使用地图的
removeLayer
等方法来动态管理图层,减少不必要的重绘。 - 调试:使用开发者工具的性能分析功能来定位具体的性能瓶颈。
通过上述方法,可以有效管理地图实例,减少页面返回时的卡顿现象。