MapboxMarker

View source
标记,默认插槽渲染自定义 DOM,支持 v-model:lnglat 双向绑定与拖拽回写。

简介

MapboxMarker 在地图上放置一个标记:默认插槽提供自定义 DOM(省略则用 mapbox 默认水滴图标),位置经 v-model:lnglat 双向绑定。options.draggable 开启拖拽后,拖拽结束会把新坐标回写到绑定值。

用法

无插槽时使用默认标记,v-model:lnglat 控制位置:

<script setup lang="ts">
import type { LngLatLike } from 'mapbox-gl'

const position = ref<LngLatLike>([116.397, 39.908])
</script>

<template>
  <div class="h-115 w-full overflow-hidden rounded-(--ui-radius) border border-default">
    <MapboxMap
      :options="{
        style: 'mapbox://styles/mapbox/streets-v12',
        center: [116.397, 39.908],
        zoom: 12
      }"
    >
      <!-- 无插槽时使用 mapbox 默认水滴标记 -->
      <MapboxMarker v-model:lnglat="position" />
    </MapboxMap>
  </div>
</template>

示例

自定义内容与拖拽

默认插槽渲染自定义 DOM,开启 draggable 后拖拽实时回写坐标:

拖拽标记:116.397, 39.908
<script setup lang="ts">
import type { LngLatLike } from 'mapbox-gl'

const position = ref<LngLatLike>([116.397, 39.908])

const label = computed(() => {
  const [lng, lat] = position.value as [number, number]
  return `${lng.toFixed(3)}, ${lat.toFixed(3)}`
})
</script>

<template>
  <div class="h-115 w-full overflow-hidden rounded-(--ui-radius) border border-default">
    <MapboxMap
      :options="{
        style: 'mapbox://styles/mapbox/streets-v12',
        center: [116.397, 39.908],
        zoom: 12
      }"
    >
      <!-- 默认插槽自定义 DOM;draggable 时拖拽结束回写 v-model:lnglat -->
      <MapboxMarker v-model:lnglat="position" :options="{ draggable: true }">
        <div
          class="flex size-8 items-center justify-center rounded-full border-2 border-white bg-primary text-white shadow-lg"
        >
          <UIcon name="i-lucide-map-pin" class="size-4" />
        </div>
      </MapboxMarker>
      <div
        class="absolute left-3 top-3 z-10 rounded-(--ui-radius) border border-default bg-default/80 px-3 py-1.5 text-sm backdrop-blur"
      >
        拖拽标记:{{ label }}
      </div>
    </MapboxMap>
  </div>
</template>

API

Props

Prop Default Type
lnglatmapboxgl.LngLat | { lng: number; lat: number; } | { lon: number; lat: number; } | [number, number]
optionsOmit<mapboxgl.MarkerOptions, "element">

标记选项;element 由默认插槽提供,无需在此传入

Emits

Event Type
update:lnglat[value: mapboxgl.LngLatLike]

Slots

Slot Type
default{}

Expose

通过 useTemplateRef 访问组件实例。

NameType
marker() => Marker | undefined

获取底层 mapbox-gl Marker 实例

Changelog

No recent changes
Copyright © 2026 - 2026 YiXuan - MIT License