uni-app 使用 renderjs 和 leaflet 进行地图渲染时,两级跳转pages操作后再返回地图页面,操作会变得卡顿

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

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中使用renderjsleaflet进行地图渲染时,如果遇到在两级跳转页面后返回地图页面导致操作卡顿的问题,可能是由于页面状态未正确恢复或者资源未有效管理导致。以下是一个简化的代码示例,展示如何在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: '&copy; <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定义了initMaponShow函数。initMap负责初始化地图,并在每次调用时清理之前的地图实例,避免内存泄漏。onShow是在页面显示时被调用的函数,用于重新初始化地图。

注意事项

  • 资源管理:确保在onUnload或适当的生命周期钩子中清理地图实例和其他资源,虽然renderjs有自己的垃圾回收机制,但显式清理可以避免潜在问题。
  • 性能优化:如果地图数据复杂,考虑使用地图的removeLayer等方法来动态管理图层,减少不必要的重绘。
  • 调试:使用开发者工具的性能分析功能来定位具体的性能瓶颈。

通过上述方法,可以有效管理地图实例,减少页面返回时的卡顿现象。

回到顶部