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>
相关推荐
程序员爱钓鱼42 分钟前
Python 编程实战 · 实用工具与库 — Flask 路由与模板
前端·后端·python
JIngJaneIL43 分钟前
旅游|内蒙古景点旅游|基于Springboot+Vue的内蒙古景点旅游管理系统设计与实现(源码+数据库+文档)
java·vue.js·spring boot·论文·旅游·毕设·内蒙古景点旅游
麦麦大数据3 小时前
D038 vue+django西游记问答知识图谱可视化系统
vue.js·django·问答系统·知识图谱·neo4j·可视化·可是还
合作小小程序员小小店4 小时前
web开发,在线%超市销售%管理系统,基于idea,html,jsp,java,ssh,sql server数据库。
java·前端·sqlserver·ssh·intellij-idea
不爱学英文的码字机器5 小时前
重塑 Web 性能:用 Rust 与 WASM 构建“零开销”图像处理器
前端·rust·wasm
浩星5 小时前
react的框架UmiJs(五米)
前端·javascript·react.js
子醉7 小时前
推荐一种适合前端开发使用的解决本地跨域问题的办法
前端
Niyy_7 小时前
前端一个工程构建多个项目,记录一次工程搭建
前端·javascript
xiangxiongfly9158 小时前
CSS link标签
前端·css
快乐非自愿8 小时前
常用设计模式:工厂方法模式
javascript·设计模式·工厂方法模式