You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中Google Maps API地图标记无法移除问题求助

Vue中Google Maps标记无法移除的原因及解决方法

问题原因

核心问题出在Vue的响应式深度代理机制:

  • 你用ref<google.maps.Marker[]>([])创建了响应式数组,Vue会对数组内的每个Marker实例做深度代理(包装成Proxy对象)。
  • 调用marker.setMap(null)时,实际触发的是Proxy代理后的方法,而非Google Maps Marker的原生实例方法,导致标记移除逻辑无法正常执行。

解决方案

用shallowRef替代ref存储Marker数组:

  • shallowRef仅对数组的顶层引用做响应式处理,不会深度代理内部的Marker对象,能保证调用的是Marker的原生方法,同时满足我们跟踪数组引用变化的需求。

修改后的代码示例

脚本部分修改

<script setup lang="ts">
import { Loader } from '@googlemaps/js-api-loader'
import { onMounted, ref, shallowRef } from 'vue'

const loader = new Loader({
  apiKey: '<your-API-key-here>',
  libraries: ['places']
})

const map = ref<google.maps.Map>()
const mapContainer = ref<HTMLDivElement>()
// 改用shallowRef避免深度代理Marker实例
const markers = shallowRef<google.maps.Marker[]>([])

onMounted(async () => {
  await loader.load()

  map.value = new google.maps.Map(mapContainer.value as HTMLDivElement, {
    zoom: 4,
    center: { lat: 40, lng: -100 }
  })
})

const clearMarkers = () => {
  markers.value.forEach((marker) => {
    marker.setMap(null)
  })
  markers.value = []
}

const addMarkers = () => {
  const newMarkers = [
    { lat: 37.535916, lng: -96.524573 },
    { lat: 46.021019, lng: -117.147974 },
    { lat: 40.662888, lng: -81.018198 }
  ]

  newMarkers.forEach((marker) => {
    markers.value.push(new google.maps.Marker({ map: map.value, position: marker }))
  })
}
</script>

模板部分保持不变

<div ref="mapContainer" style="width: 500px; height: 500px">Google Map will load here</div>

验证逻辑

修改后调用clearMarkers时,marker.setMap(null)会直接触发Google Maps Marker的原生方法,正确移除地图上的标记,同时清空markers数组。

内容的提问来源于stack exchange,提问作者chipit24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:47:07