vue3使用异步加载腾讯地图

vue3中之前是在index.html中全局加载

复制代码
<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <link rel="icon" type="image/svg+xml" href="/logo.png" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>
    <%= VITE_APP_TITLE %>
  </title>
  <script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=您的key&libraries=drawing"></script>
</head>

<body>
  <div id="app"></div>
  <script type="module" src="/src/main.ts"></script>
</body>

</html>

现在需要异步加载腾讯地图,key的话是从后端获取的,大概来记录下

第一步:新建文件夹tencent-map.ts,进行从后端获取key(我这边的key后端加了密,我这需要进行用CryptoJS进行解密),然后进行载入腾讯地图js获取api

复制代码
import { GetMapKey } from '@CM/api/common'
import CryptoJS from 'crypto-js'


//获取腾讯地图的key
export const getMapKeyFun = async () => {
  const res = await GetMapKey()
  const { type, value } = res
  if (type == 'SUCCESS') {
    const secretKey = 'MKhmEob9b5iU2iHG'
    const keyUtf8 = CryptoJS.enc.Utf8.parse(secretKey)
    const encryptedHex = CryptoJS.enc.Hex.parse(value)
    const encryptedBase64 = CryptoJS.enc.Base64.stringify(encryptedHex)
    const decrypted = CryptoJS.AES.decrypt(encryptedBase64, keyUtf8, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    })
    return decrypted.toString(CryptoJS.enc.Utf8)
  }
}

/**
 * 载入腾讯地图js文件
 * @param config
 */
const loadTMapScript=async()=> {
  const key = await  getMapKeyFun();

  // 引入腾讯地图js,当引入完成时会调用window.customVueTMap.loadCallBack方法
  const TMap_URL = `https://map.qq.com/api/js?v=2.exp&key=${key}&libraries=drawing&callback=customVueTMap.loadCallBack`;
  // 插入script脚本
  let scriptNode = document.createElement("script");
  scriptNode.setAttribute("src", TMap_URL);
  document.body.appendChild(scriptNode);
}

/**
 * 懒加载腾讯地图方法
 * @returns {Promise<unknown>}
 */

const lazyTMapApiLoaderInstance = new Promise<void>((resolve, reject) => {
  loadTMapScript()
  // 地图异步加载完成回调处理,避免每个组件都要在自己的功能写个window下的函数造成冲突
  window.customVueTMap = {
    loadCallBack() {
      resolve();
    }
  }
})
export {lazyTMapApiLoaderInstance};

第二步:在组件中使用

复制代码
<script lang="ts" setup>
import { lazyTMapApiLoaderInstance } from '@CG/utils/tencent-map'

declare const qq: any // 临时声明,待定义

onMounted(() => {
  lazyTMapApiLoaderInstance.then(() => {
     new qq.maps.Map(document.getElementById('container'), {
        center: new qq.maps.LatLng(39.908165, 116.397165),
        zoom: 15,
        mapTypeControl: false,
        zoomControlOptions: {
          position: qq.maps.ControlPosition.TOP_RIGHT
        },
        panControlOptions: {
          position: qq.maps.ControlPosition.TOP_RIGHT
        }
      })
   })
})
</script>
相关推荐
GISer_Jing2 小时前
前端面试通关:Cesium+Three+React优化+TypeScript实战+ECharts性能方案
前端·react.js·面试
落霞的思绪3 小时前
CSS复习
前端·css
咖啡の猫5 小时前
Shell脚本-for循环应用案例
前端·chrome
百万蹄蹄向前冲7 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5818 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路8 小时前
GeoTools 读取影像元数据
前端
ssshooter9 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
你的人类朋友9 小时前
【Node.js】什么是Node.js
javascript·后端·node.js
Jerry9 小时前
Jetpack Compose 中的状态
前端
dae bal10 小时前
关于RSA和AES加密
前端·vue.js