vue使用百度地图

这篇博客记录了作者在Vue项目中从使用高德地图转为使用百度地图的过程,遇到的主要问题是`BMap`未定义和地图元素加载时机的问题。通过在`window`对象下引用`BMap`和使用`Vue`的`nextTick`及`ref`解决了问题。内容包括地图的引入、页面展示、地图实例化以及问题的解决方法。
摘要由CSDN通过智能技术生成

以前都是使用的高德地图,百度地图第一次玩,但是有了高德地图的基础,应该实现不难,但是依然不可避免的踩了很多坑,现在拿出来纪录一下

  • 地图引入
    • 和高德一样,可以直接在vueindex.html中引入百度地图的js文件,至于这个key,可以看看文档是怎么来的,这一步一般没啥问题的,和文档走就是了
  <script
    type="text/javascript"
    src="http://api.map.baidu.com/api?v=2.0&ak=你的key值"
  ></script>
  • 页面展示
    • 相信大部分人,肯定不会像文档一样,将引入的JS文件放在当前页面,比如用vue,肯定会将文件引入到public里面的index.html中,然后再去地图页面再进行正常的业务逻辑书写
// public/index.html
// 引入地图js文件
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的key值"></script>
// 组件页   Amap.vue
<!--
 * @Author: zhangrongkai
 * @Date: 2022-06-13 16:20:07
 * @LastEditors: Zhang Rong Kai
 * @LastEditTime: 2022-06-14 18:23:53
 * @Description: gps地图弹窗
-->
<template>
  <div>
    <el-dialog
      title="申请时的GPS地址"
      :visible.sync="gpsDialogVisible"
      width="60%"
    >
      <div id="allmap" style="width: 1110px; height: 500px"></div>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name: '',
  components: {},
  props: {
    addressObj: {
      type: String
    }
  },
  data() {
    return {
      gpsDialogVisible: false,
      map: null
    };
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {},
  methods: {
    handleClose() {
      this.$emit('closeGpsDialog');
    },
    createAMap() {
      const addList = this.addressObj.split(',');
      // 百度地图API功能
      this.map = new window.BMap.Map('allmap');
      const point = new window.BMap.Point(
        Number(addList[0]),
        Number(addList[1])
      );
      // 创建Map实例
      this.map.centerAndZoom(point, 13); // 初始化地图,设置中心点坐标和地图级别

      const marker = new window.BMap.Marker(point); // 创建标注
      this.map.addOverlay(marker);
      this.map.addEventListener('click', (e) => {
        console.log(e);
      });
      this.map.enableScrollWheelZoom(true);
    }
  },
};
</script>

<style scoped lang="scss">
.map {
  width: 700px;
  height: 300px;
}
</style>

// 地图调用 index.vue
<template>
	<div @click="clickGps">
		<Amap ref="gpsDialog" :addressObj="customerInfo.applyAddress"/>
	<div>
</template>

import Amap from 'Amap.vue';

methods: {
	clickGps() {
		this.$refs.gpsDialog._data.gpsDialogVisible = true;
	    this.$nextTick(() => {
        	this.$refs.gpsDialog.createAMap();
      	});
	}
}
  • 踩坑
  • BMap报错error ‘BMap‘ is not defined
因为在index.html中引入了地图js,所以这个时候可以在window对象中找到BMap属性,如果按照官方的直接写,就会报错

var map = new BMap.Map('allmap'); // error ‘BMap‘ is not defined

解决方法一
var map = new window.BMap.Map('allmap');

解决方法二
// 在当前页面script外面定义一个
const { BMap } = window

var map = new BMap.Map('allmap');
  • Cannot read property 'gc' of undefined
大概意思就是,地图的dom都没加载完,就开始运行方法了
试过网上修改生命周期调用、v-if、v-show,都没用
后面发现,我使用了el-dialog的弹窗,在vue中,弹窗是要先加载的,
然后我使用
nextTick()ref()配合使用然后完成了
详细见
clickGps()方法
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值