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>
相关推荐
xiaofeichaichai21 小时前
Webpack
前端·webpack·node.js
问心无愧051321 小时前
ctf show web入门111
android·前端·笔记
唐某人丶21 小时前
模型越来越强,我们还需要 Agent 工程吗?—— 从价值重估到 Harness 实践
前端·agent·ai编程
智码看视界21 小时前
现代Web开发基础:全栈工程师的起航点
前端·后端·c5全栈
JS菌1 天前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
excel1 天前
HLS TS 文件损坏的元凶:Git 提交与拉取
前端
Aphasia3111 天前
https连接传输流程
前端·面试
徐小夕1 天前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
梦梦代码精1 天前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范