vue异步引入百度地图API

Vue异步引入百度地图的特殊方法
官网采用原生写法引入百度地图,不适用于Vue。异步引入百度地图可方便管理baiduAK。代码采用定时器循环resolve(BMap),解决因异步无法正常返回BMap的问题,并介绍了引入和使用方式。

看了下官网上的方法,是采用原生的写法,不适用于vue

异步引入的好处是baiduAK可以方便管理

import { baiduAk } from '@/settings'

export function map() {
  /* eslint-disable */
  return new Promise(function(resolve, reject) {
    if (typeof (BMap) !== 'undefined') return resolve(BMap)
    var script = document.createElement('script')
    script.type = 'text/javascript'
    script.src = `http://api.map.baidu.com/api?v=2.0&ak=${baiduAk}&callback=init`
    script.onerror = reject
    document.head.appendChild(script)
    const timer = setInterval(() => {
      if (BMap) {
        resolve(BMap)
        clearInterval(timer)
      }
    }, 500)
  })
}

此代码特殊在于使用了定时器循环resolve(BMap),因异步原因,有时无法正常返回BMap,故采用此写法

引入方式

import { map } from '@/utils/map'

使用方式

            this.$nextTick(() => {
              map().then(BMap => {
                this.map = new BMap.Map('allmap', { enableMapClick: false })
                const point = new BMap.Point(longitude, latitude)
                this.map.centerAndZoom(point, 17)
                this.map.enableScrollWheelZoom() // 启用滚轮放大缩小,默认禁用
                this.map.enableContinuousZoom() // 启用地图惯性拖拽,默认禁用
              })
            })

 

### 如何在 Vue引入并配置百度地图 API 要在 Vue 项目中成功引入并配置百度地图 API,可以按照以下方式实现: #### 1. 注册获取 AK 首先,在使用百度地图 API 前,需要前往百度开放平台注册账号,并创建应用以获得访问密钥(AK)。这是调用百度地图服务的前提条件[^2]。 #### 2. 创建异步加载脚本 为了动态加载百度地图的 JavaScript 文件,可以通过创建一个工具函数来完成。以下是基于 Vue异步加载方案之一: ```javascript // utils/map.js export function loadBaiduMap(ak) { return new Promise((resolve, reject) => { if (window.BMapGL && typeof window.BMapGL.Map === "function") { resolve(window.BMapGL); } else { window.init = () => { if (!window.BMapGL || typeof window.BMapGL.Map !== "function") { reject(new Error("Failed to initialize BMapGL")); } resolve(window.BMapGL); }; const script = document.createElement("script"); script.type = "text/javascript"; script.src = `https://api.map.baidu.com/api?v=3.0&type=webgl&ak=${ak}&callback=init`; script.onerror = () => reject(new Error("Script failed to load")); document.head.appendChild(script); } }); } ``` 此代码片段通过动态插入 `<script>` 标签的方式加载百度地图库,并支持回调机制以确保资源加载完成后执行后续逻辑[^3]。 #### 3. 在 Vue 组件中集成百度地图 下面是一个完整的 Vue 单文件组件示例,展示了如何结合前面定义好的工具函数渲染一张简单的地图: ```vue <template> <div class="map-container"> <div ref="mapContainer" class="baidu-map"></div> </div> </template> <script setup> import { ref, onMounted } from "vue"; import { loadBaiduMap } from "@/utils/map"; const mapContainer = ref(null); onMounted(async () => { const ak = "your_api_key_here"; // 替换为实际申请到的应用 AK try { const BMapGL = await loadBaiduMap(ak); const map = new BMapGL.Map(mapContainer.value); // 初始化地图实例 const point = new BMapGL.Point(116.404, 39.915); // 定义中心点经纬度 map.centerAndZoom(point, 15); // 设置缩放级别和初始位置 } catch (error) { console.error("Error initializing Baidu Map:", error.message); } }); </script> <style scoped> .map-container { width: 100%; height: 400px; } .baidu-map { width: 100%; height: 100%; } </style> ``` 在此模板中,我们利用了 Vue Composition API (`setup`) 来管理生命周期钩子 `onMounted` 和响应式变量 `ref`。当组件挂载完毕后会自动触发地图初始化过程[^1]。 --- ### 注意事项 - **跨域问题**:如果遇到因浏览器安全策略引发的地图显示异常,请确认服务器端已正确配置 CORS 头部信息。 - **性能优化**:对于频繁使用的场景建议将地图加载逻辑封装成独立插件形式以便复用。 - **版本兼容性**:不同版本间可能存在接口差异,请始终查阅最新文档验证功能可用性[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值