uni-app 使用renderjs版高德地图从地图页跳转至可滚动页面并发生滚动后报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)

发布于 1周前 作者 zlyuanteng 来自 Uni-App

uni-app 使用renderjs版高德地图从地图页跳转至可滚动页面并发生滚动后报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)

操作步骤

运行我的实例代码 点击左上角的黑色方块 跳转到滚动页并滚动即可复现

预期结果

不应该报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)

实际结果

报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)

bug描述

【报Bug】在一个页面中使用renderjs版高德地图,另一个页面存在滚动条,从地图页跳转至可滚动页面并发生滚动后,报错Uncaught Error: Invalid Object: Pixel(NaN, NaN),返回地图页后无法正常使用地图了

附件

开发环境信息

项目创建方式 PC开发环境操作系统 PC开发环境操作系统版本号 HBuilderX类型 HBuilderX版本号 浏览器平台 浏览器版本
HBuilderX Windows window11专业版 23H2 正式 4.29 Chrome 版本 131.0.6778.205(正式版本) (64 位)

6 回复

同样碰到了,请问解决了嘛


没有 不过app中没事,就是web端会报错

回复 1***@qq.com: 找到了一个解决方案,就是在渲染的时候,将原来的3D,搞成2D。就不会报这个错误了。

可以提供一个测试工程吗

我的test.zip附件里面就有

在处理uni-app中使用renderjs版高德地图从地图页跳转至可滚动页面并发生滚动后出现的Uncaught Error: Invalid Object: Pixel(NaN, NaN)错误时,通常是由于地图组件在页面切换或滚动过程中未能正确更新其尺寸或位置信息导致的。这种情况常见于地图组件在DOM结构中的位置发生变化时,地图对象未能及时感知并调整。

为了解决这个问题,我们可以通过在页面滚动或页面切换时手动触发地图的重绘或重新计算位置。以下是一个可能的解决方案示例,使用uni-app结合renderjs来管理高德地图对象,并在页面切换或滚动时更新地图状态。

示例代码

1. 引入高德地图SDK并初始化地图(在renderjs中)

// map.renderjs
import AMap from 'amap-js-api-render';
let mapInstance;

export function initMap(containerId) {
    AMap.plugin('AMap.MarkerClusterer', () => {
        mapInstance = new AMap.Map(containerId, {
            resizeEnable: true,
            // 其他地图配置
        });
        // 地图初始化代码
    });
}

export function resizeMap() {
    if (mapInstance) {
        mapInstance.resize();
    }
}

2. 在Vue组件中管理地图生命周期

<template>
    <view id="mapContainer" style="width: 100%; height: 100%;"></view>
</template>

<script>
export default {
    onReady() {
        // 初始化地图
        this.$refs.renderJs.initMap('mapContainer');
        
        // 监听页面滚动事件
        window.addEventListener('scroll', this.handleScroll);
    },
    beforeDestroy() {
        // 移除滚动事件监听
        window.removeEventListener('scroll', this.handleScroll);
    },
    methods: {
        handleScroll() {
            // 调用renderjs中的resizeMap方法
            this.$refs.renderJs.resizeMap();
        }
    },
    renderjs: {
        data() {
            return {
                renderJs: {
                    initMap: initMap,
                    resizeMap: resizeMap
                }
            };
        }
    }
};
</script>

说明

  • initMap函数用于初始化高德地图实例,并设置其容器。
  • resizeMap函数用于在地图容器尺寸变化时重新调整地图大小。
  • 在Vue组件的onReady生命周期钩子中调用initMap初始化地图,并监听页面滚动事件。
  • 在页面滚动时调用resizeMap以确保地图正确调整大小。
  • 在组件销毁前移除滚动事件监听,避免内存泄漏。

通过这种方式,可以有效避免因页面切换或滚动导致的地图错误。

回到顶部