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>

五、实现效果

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A1 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
honkun61 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net