动态引入百度地图

文章介绍了如何在Vue项目中动态加载百度地图API,通过设置不同的环境变量来区分开发和生产环境的key,避免手动修改index.html。在baiduMap.js文件中,利用Promise封装了获取BMap的方法,并在子组件中按需引入和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

根据百度地图官方的文档,key 是直接放在 index.html 文件中,通过 script 标签的方式进行引入。
但是在实际的开发中,我们开发环境和生产环境所使用的 key 一般是不一样的,所以每次打包的时候需要手动不断修改 index.html 中的 key 。这样就会造成有时候会忘记修改,那么应该如何正确使用呢?

思路:

动态加载百度地图,把百度地图密钥存储在环境变量中,通过 js 创建 script 标签动态引入百度地图脚本,然后再抛出函数,在所需要的子组件中使用。

实现:

1.首先,在你的Vue项目的 .env.development 和 .env.production 文件中,分别设置百度地图的密钥变量:

(没有 .env.development 和 .env.production 文件的在根目录下创建,不了解这两个文件意义的请百度或看官方网站)
.env.development:

VUE_APP_BAIDU_MAP_KEY=your_development_key_here

.env.production:

VUE_APP_BAIDU_MAP_KEY=your_production_key_here

2.动态引入百度地图脚本的代码单独封装为一个JavaScript文件,并在HTML中引入该文件时,可以按照以下步骤操作:

2.1创建一个名为 baiduMap.js 的JavaScript文件,并将下面的代码复制到该文件中:

// baiduMap.js

const baiduMapKey = process.env.VUE_APP_BAIDU_MAP_KEY;

export function getBMap () {
  if (!baiduMapKey) {
    return;
  }
  const BMap_URL = `https://api.map.baidu.com/api?v=3.0&ak=${baiduMapKey}&s=1&callback=onBMapCallback`;
  return new Promise((resolve, reject) => {
    // 如果已加载直接返回
    if (typeof BMap !== 'undefined') {
      resolve(BMap)
      return true;
    }

    // 百度地图异步加载回调处理
    window.onBMapCallback = () => {
      console.log('百度地图脚本初始化成功...');
      // console.log(BMap);
      resolve(BMap)
    }

    // 插入script脚本
    const scriptElement = document.createElement('script');
    scriptElement.type = 'text/javascript'
    scriptElement.src = BMap_URL
    document.head.appendChild(scriptElement);
  })
}

2.2将 baiduMap.js 文件放置在Vue项目中的合适位置,例如在 src 目录下的 utils 文件夹中.

2.3子组件中引入 getBMap()

以 vue-cli 创建的初始模板中的 HomeView.vue 为例:

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
    <div id="map" style="width: 400px;height: 400px;"></div>
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>
  
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
import {getBMap} from '@/utils/baiduMap.js'

export default {
  name: 'HomeView',
  components: {
    HelloWorld
  },
  mounted() {
    this.initMap()
  },
  methods: {
    async initMap() {
      const BMap = await getBMap()
      const map = new BMap.Map('map')
      const centerPoint = new BMap.Point(120.186582, 30.317703)
      map.centerAndZoom(centerPoint, 15)
    }
  }
}
</script>

效果如下:
在这里插入图片描述

百度map,百度map API,百度地图 实现百度地图动态搜索、静态地图动态插入 mygw@163.com js 内容如下: /** 加载地图的主控类 */ var MapControl={ staticWith : 512,//链接静态图宽度 staticHeight : 320,//链接静态图的高度 container : 'mapcontainer',//显示map的节点id defzoom:12,//默认缩放比例 map : '', marker : '', city : '深圳', infoWinContent : '请移动此标记到您的婚礼地点位置!', /** 提示信息窗内容 */ infoOpts : { width : 100, // 信息窗口宽度 height: 50, // 信息窗口高度 title : "提示:" // 信息窗口标题 }, /** *默认显示窗口 */ defWindow : function(){ this.map = new BMap.Map(this.container); this.map.centerAndZoom(this.city,this.defzoom); // 通过城市名初始化地图 this.map.addEventListener("load", function(){ // 初始化方法执行完成后即可获取地图中心点信息 MapControl.marker = new BMap.Marker( this.getCenter()); // 创建标注 this.addOverlay(MapControl.marker ); // 将标注添加到地图中 MapControl.marker.enableDragging(); var infoWindow = new BMap.InfoWindow(MapControl.infoWinContent, MapControl.infoOpts); // 创建信息窗口对象 MapControl.marker.addEventListener("mouseover", function(){ this.openInfoWindow(infoWindow); // 打开信息窗口 }) MapControl.marker.addEventListener("mouseout", function(){ this.closeInfoWindow(); // 打开信息窗口 }) }) //map 增加操作 this.map.addControl(new BMap.NavigationControl()); this.map.addControl(new BMap.ScaleControl()); this.map.addControl(new BMap.OverviewMapControl()); this.map.addControl(new BMap.MapTypeControl()); }, /** * 搜索地址 */ search : function(address){ if(this.map=='' || this.map == 'undefined' || address=='' ){ return ; } this.city=address; this.defWindow(); }, /** * 获取静态图片地址 */ getStaticMap : function(){ if(this.map=='' || this.map == 'undefined' || this.marker=='' ){ return ; } var center=this.map.getCenter().lng+','+this.map.getCenter().lat; var markers= this.marker.getPosition().lng+','+this.marker.get
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值