uni-app renderjs渲染地图 进入子页面后返回 出现卡顿

发布于 1周前 作者 songsunli 来自 uni-app

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

21 回复

提供个demo的包我试试可能复现


来个邮箱,发你demo

回复 jks: 被覆盖的页面(onHide),停止绘制

回复 昭昭L: 请问停止绘制是怎么实现呢

邮箱845421420@qq.com 要个demo包,试一下

哥们,问题解决了么?

回复 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>

说明

  1. 资源释放:在 MapPage.vueonUnload 生命周期钩子中调用 destroyMap 方法,确保地图资源被正确释放。
  2. renderjs 管理:利用 renderjsmountedunmounted 钩子来管理地图的初始化和销毁。
  3. 页面跳转:使用 navigator 组件实现页面间的跳转。

确保在实际项目中替换 YOUR_MAP_KEY 为你的腾讯地图 API 密钥,并根据需要调整地图初始化的参数。这样处理可以有效减少页面切换时的卡顿现象。

回到顶部