uni-app renderjs渲染地图 进入子页面后返回 出现卡顿
uni-app renderjs渲染地图 进入子页面后返回 出现卡顿
操作步骤:
创建简单项目模板,使用renderjs加载ol,创建地图。按钮跳转子页面,子页面返回
预期结果:
子页面返回后不应该卡顿
实际结果:
页面卡顿
bug描述:
在renderjs中使用ol加载地图,地图页面为首页,使用navigateTo跳转到子页面后,地图页面不做任何操作,等待数分钟后,拖动地图卡顿,或子页面停留久后,返回地图页,拖动卡顿。卡顿程度随时间增加加剧,有不加任何业务逻辑的简单demo可提供。
项目 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | 22621.1702 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.8.6 |
手机系统 | Android |
手机系统版本号 | Android 10 |
手机厂商 | 华为 |
手机机型 | p20Pro |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
来个邮箱,发你demo
回复 jks: 被覆盖的页面(onHide),停止绘制
回复 昭昭L: 请问停止绘制是怎么实现呢
哥们,问题解决了么?
还没有
回复 jks: 哥们,我解决这个路由跳转地图卡顿的问题了
回复 5***@qq.com: 牛逼,怎么个方案
回复 jks: 你用的是什么地图?openlayer么
回复 5***@qq.com: 是的
应该是openlayer 适配没有leaflet好,你试一下
回复 5***@qq.com: 好的,多谢。
回复 jks: 嗯嗯,可行的话回复我哈
回复 5***@qq.com: 实验了一下,使用leaflet确实没有这种问题,搞不懂哪个机制影响的。
回复 jks: 嗯嗯
回复 5***@qq.com: 兄弟,哈哈。这个leaflet适配了卡顿但不适配ios哈哈,ios你得用openlayer 安卓用leaflet
有解决方案了吗
有
请问是什么解决方法呢,我用uniapp加载leaflet时出现了这个问题,在切换页面并进入三级子页面返回后,地图页面卡顿
在处理 uni-app
使用 renderjs
渲染地图时,进入子页面再返回主页面出现卡顿的问题,通常是由于资源未被正确释放或页面状态未得到妥善管理。以下是一个简化的代码示例,展示了如何在页面切换时正确释放地图资源以及管理页面状态,以减少卡顿现象。
主页面(MapPage.vue)
<template>
<view>
<map id="myMap" :longitude="longitude" :latitude="latitude" style="width: 100%; height: 400px;"></map>
<navigator url="/pages/subPage/subPage">Go to SubPage</navigator>
</view>
</template>
<script>
export default {
data() {
return {
longitude: 116.404,
latitude: 39.915,
mapContext: null
};
},
onLoad() {
this.initMap();
},
onUnload() {
this.destroyMap();
},
methods: {
initMap() {
// 使用 renderjs 初始化地图
this.$refs.mapContainer.renderjs = {
mounted() {
const mapScript = document.createElement('script');
mapScript.src = 'https://map.qq.com/api/gljs?v=1.exp&key=YOUR_MAP_KEY';
document.head.appendChild(mapScript);
mapScript.onload = () => {
const map = new qq.maps.Map(document.getElementById('myMap'), {
center: new qq.maps.LatLng(this.latitude, this.longitude),
zoom: 14
});
this.mapContext = map;
};
},
unmounted() {
if (this.mapContext) {
this.mapContext = null;
// 清除地图实例,释放资源
const mapElement = document.getElementById('myMap');
if (mapElement) {
mapElement.innerHTML = '';
}
}
}
};
},
destroyMap() {
// 确保在组件卸载时调用 renderjs 的 unmounted 方法
this.$refs.mapContainer.renderjs.unmounted();
}
}
};
</script>
<style scoped>
/* 样式 */
</style>
子页面(SubPage.vue)
<template>
<view>
<text>This is SubPage</text>
<navigator url="/pages/mapPage/mapPage">Back to MapPage</navigator>
</view>
</template>
<script>
export default {
// 子页面逻辑
};
</script>
<style scoped>
/* 样式 */
</style>
说明
- 资源释放:在
MapPage.vue
的onUnload
生命周期钩子中调用destroyMap
方法,确保地图资源被正确释放。 - renderjs 管理:利用
renderjs
的mounted
和unmounted
钩子来管理地图的初始化和销毁。 - 页面跳转:使用
navigator
组件实现页面间的跳转。
确保在实际项目中替换 YOUR_MAP_KEY
为你的腾讯地图 API 密钥,并根据需要调整地图初始化的参数。这样处理可以有效减少页面切换时的卡顿现象。