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

更多关于uni-app renderjs渲染地图 进入子页面后返回 出现卡顿的实战教程也可以访问 https://www.itying.com/category-93-b0.html

21 回复

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

更多关于uni-app renderjs渲染地图 进入子页面后返回 出现卡顿的实战教程也可以访问 https://www.itying.com/category-93-b0.html


来个邮箱,发你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 密钥,并根据需要调整地图初始化的参数。这样处理可以有效减少页面切换时的卡顿现象。

回到顶部