vue | 在 Vue 3 项目中集成高德地图(AMap)

一、准备工作

1. 获取高德地图 Key

  • 登录 高德开放平台
  • 创建应用 → 获取 Web 端 JS API Key

二、安装依赖

bash 复制代码
npm install @amap/amap-jsapi-loader
# 或
yarn add @amap/amap-jsapi-loader

不要直接通过 <script> 引入 CDN,避免与 Vue 响应式冲突。


三、封装高德地图 Hook

创建 hooks/useAmap.js

javascript 复制代码
import { onMounted, onUnmounted, ref } from 'vue'
import AMapLoader from '@amap/amap-jsapi-loader'

const useAmap = (containerId, options = {}) => {
  const map = ref(null)
  const AMap = ref(null)

  const initMap = async () => {
    try {
      // 加载高德地图 SDK
      const amap = await AMapLoader.load({
        key: '', // 替换为你的 key
        version: '2.0', // 推荐 2.0+
        plugins: [
          'AMap.Geolocation',
          'AMap.Marker',
          'AMap.InfoWindow',
          'AMap.Polyline',
          'AMap.Circle',
          'AMap.Scale',
          'AMap.ToolBar',
        ],
      })

      AMap.value = amap

      // 初始化地图
      const mapInstance = new amap.Map(containerId, {
        zoom: options.zoom || 16,
        center: options.center || [116.397428, 39.90923], // 默认北京
        viewMode: '3D',
        layers: [new amap.TileLayer.Satellite(), new amap.TileLayer.RoadNet()],
        visible: true,
        resizeEnable: true,
        zooms: [2, 20],
      })

      map.value = mapInstance

      // 可选:添加缩放控件等
      mapInstance.addControl(new amap.ToolBar())
      mapInstance.addControl(new amap.Scale())

      return mapInstance
    } catch (error) {
      console.error('高德地图加载失败:', error)
    }
  }

  onMounted(() => {
    initMap()
  })

  onUnmounted(() => {
    if (map.value) {
      map.value.destroy()
    }
  })

  return {
    map,
    AMap,
    initMap,
  }
}

export default useAmap

四、在组件中使用

javascript 复制代码
<template>
  <div id="amap-container" class="map-container"></div>
</template>

<script setup>
import { onMounted } from 'vue'
import useAmap from '@/hooks/useAmap'

const { map, AMap, initMap } = useAmap('amap-container', {
  zoom: 13,
  center: [84.920629, 45.417129],
})
onMounted(() => {
  initMap()
})
</script>

<style scoped>
.map-container {
  width: 100%;
  height: 600px;
  border-radius: 8px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
</style>

五、实现效果

相关推荐
Halo_tjn1 小时前
基于封装的专项 知识点
java·前端·python·算法
摘星编程1 小时前
OpenHarmony环境下React Native:自定义useTruncate文本截断
javascript·react native·react.js
Duang007_2 小时前
【LeetCodeHot100 超详细Agent启发版本】字母异位词分组 (Group Anagrams)
开发语言·javascript·人工智能·python
有来技术2 小时前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端
东东5163 小时前
学院个人信息管理系统 (springboot+vue)
vue.js·spring boot·后端·个人开发·毕设
2601_949868363 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 主入口实现
开发语言·javascript·flutter
m0_748229993 小时前
Vue2 vs Vue3:核心差异全解析
前端·javascript·vue.js
C澒4 小时前
前端监控系统的最佳实践
前端·安全·运维开发
xiaoxue..4 小时前
React 手写实现的 KeepAlive 组件
前端·javascript·react.js·面试
摘星编程4 小时前
在OpenHarmony上用React Native:自定义useHighlight关键词高亮
javascript·react native·react.js