uni-app 谷歌地图 map组件在首页切换tabbar后切回首页 map组件参数失效并定位到默认点(非洲)

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

uni-app 谷歌地图 map组件在首页切换tabbar后切回首页 map组件参数失效并定位到默认点(非洲)

项目 信息
产品分类 uniapp/App
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 12
HBuilderX类型 正式
HBuilderX版本号 3.98
手机系统 Android
手机系统版本号 Android 14
手机厂商 小米
手机机型 红米 ut 12
页面类型 nvue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

<template>  
    <view class="content">  
        <map name="" ref="map" id="map" style="flex: 1;width: 750rpx;" :longitude="130.3786716" :latitude="33.5578242"  
            scale="12">  
        </map>  
    </view>  
</template>  

<script>  
    var mapView = null  
    export default {  
        data() {  
            return {  
                title: 'Hello',  
                list2: [{  
                    "id": 1,  
                    "latitude": 33.586746399999996,  
                    "longitude": 130.3951692,  
                    "iconPath": "../../static/images/route/via.png",  
                    "width": 22,  
                    "height": 22,  
                }],  
            }  
        },  
        onLoad() {}  
    }  
</script>  

<style>  
    .content {  
        flex: 1;  
    }  
</style>

操作步骤:

  • 切换tabbar即可

预期结果:

  • 正常展示map

实际结果:

  • map所有参数失效

bug描述:

  • tabbar配置多个页面,首页是map组件展示,首次加载是正常的,切换tabbar后,切回index页面,map组件的所有参数都失效了

5 回复

最新排查情况:如果跳转到非tabbar页面再返回,地图依旧正常,只有点击tabbar跳转或者uni.switchTab再点击首页都会导致地图组件无法正常展示


新进度:想找兼容方案的,每次onShow都会用uni.createMapContext重新加载所有的map参数,发现只有第一次返回首页会出现参数丢失的情况,后面的就不会丢失也不会定位到非洲海域

在使用 uni-app 开发时,如果你在首页使用了 Google 地图的 map 组件,并且在切换 tabbar 后切回首页时,发现 map 组件的参数失效并定位到默认点(如非洲),这通常是由于页面生命周期或组件状态管理问题导致的。以下是一些可能的原因和解决方案:

1. 页面生命周期问题

当你在 tabbar 之间切换时,页面可能会被销毁或重新创建。如果 map 组件的参数在页面重新创建时没有正确初始化,就会导致地图定位到默认点。

解决方案:

  • 使用 onShow 生命周期钩子:在 onShow 生命周期钩子中重新设置地图的参数,确保每次页面显示时地图都能正确初始化。
export default {
  onShow() {
    // 重新设置地图参数
    this.initMap();
  },
  methods: {
    initMap() {
      // 初始化地图的逻辑
      this.mapContext = uni.createMapContext('myMap', this);
      this.mapContext.moveToLocation({
        latitude: this.latitude,
        longitude: this.longitude,
        success: () => {
          console.log('地图定位成功');
        },
        fail: (err) => {
          console.error('地图定位失败', err);
        }
      });
    }
  }
}

2. 组件状态管理问题

如果 map 组件的状态在页面切换时没有被正确保存,可能会导致地图参数失效。

解决方案:

  • 使用 Vuex 或全局变量:将地图的状态(如经纬度、缩放级别等)保存在 Vuex 或全局变量中,确保在页面重新创建时能够恢复这些状态。
// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    mapState: {
      latitude: 0,
      longitude: 0,
      zoom: 10
    }
  },
  mutations: {
    setMapState(state, payload) {
      state.mapState = payload;
    }
  }
});

// 页面组件
export default {
  computed: {
    mapState() {
      return this.$store.state.mapState;
    }
  },
  onShow() {
    this.initMap();
  },
  methods: {
    initMap() {
      const { latitude, longitude, zoom } = this.mapState;
      this.mapContext = uni.createMapContext('myMap', this);
      this.mapContext.moveToLocation({
        latitude,
        longitude,
        success: () => {
          console.log('地图定位成功');
        },
        fail: (err) => {
          console.error('地图定位失败', err);
        }
      });
    }
  }
}

3. 地图组件缓存问题

在某些情况下,map 组件可能会被缓存,导致在页面切换时无法正确更新。

解决方案:

  • 使用 key 属性:为 map 组件添加一个 key 属性,确保在页面切换时强制重新渲染地图组件。
<map id="myMap" :key="mapKey" :latitude="latitude" :longitude="longitude"></map>
export default {
  data() {
    return {
      mapKey: Date.now(),
      latitude: 0,
      longitude: 0
    };
  },
  onShow() {
    this.mapKey = Date.now(); // 强制重新渲染地图组件
    this.initMap();
  },
  methods: {
    initMap() {
      // 初始化地图的逻辑
    }
  }
}

4. Google 地图 API 问题

如果使用的是 Google 地图 API,确保在页面切换时 API 已经正确加载,并且没有因为页面切换而导致 API 失效。

解决方案:

  • 检查 API 加载状态:在 onShow 生命周期钩子中检查 Google 地图 API 是否已经加载,如果没有加载,则重新加载 API。
export default {
  onShow() {
    if (!window.google) {
      this.loadGoogleMapsApi();
    } else {
      this.initMap();
    }
  },
  methods: {
    loadGoogleMapsApi() {
      const script = document.createElement('script');
      script.src = 'https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY';
      script.onload = () => {
        this.initMap();
      };
      document.head.appendChild(script);
    },
    initMap() {
      // 初始化地图的逻辑
    }
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!