useMap

View source
注入当前 MapboxMap 上下文,在子组件中直接访问地图实例与就绪状态。

简介

useMap 注入由最近的 <MapboxMap> 下发的上下文,返回地图实例引用、样式就绪状态与就绪回调。它是所有声明式子组件读取地图的统一入口,无需经 id 查表。

必须在 <MapboxMap> 子树内调用,否则抛错。需要在地图组件树之外访问,请改用 useMapbox

onReady 在样式首次加载与每次 setStyle 后都会重跑,是建 source / layer、绑定事件的推荐入口;map 在 SSR 与挂载前为 undefined,组件已做 SSR 安全处理。

用法

子组件经 useMap() 读取实时相机状态(中心、缩放、就绪状态):

样式就绪:否
中心:
缩放:0
<script setup lang="ts">
import { defineComponent, h, ref } from 'vue'

// 子组件位于 <MapboxMap> 子树内,经 useMap() 注入上下文读取实时相机状态
const MapStatus = defineComponent({
  name: 'MapStatus',
  setup() {
    const { isLoaded, onReady } = useMap()
    const center = ref('')
    const zoom = ref(0)

    onReady((map) => {
      const sync = () => {
        const c = map.getCenter()
        center.value = `${c.lng.toFixed(3)}, ${c.lat.toFixed(3)}`
        zoom.value = Number(map.getZoom().toFixed(2))
      }
      sync()
      map.on('move', sync)
    })

    return () =>
      h(
        'div',
        {
          class:
            'absolute left-2 top-2 z-10 space-y-0.5 rounded bg-default/90 px-3 py-2 text-xs text-default ring ring-default'
        },
        [
          h('div', `样式就绪:${isLoaded.value ? '' : ''}`),
          h('div', `中心:${center.value}`),
          h('div', `缩放:${zoom.value}`)
        ]
      )
  }
})
</script>

<template>
  <div class="h-115 w-full overflow-hidden rounded-(--ui-radius) border border-default">
    <MapboxMap
      :options="{ style: 'mapbox://styles/mapbox/light-v11', center: [116.397, 39.908], zoom: 10 }"
    >
      <MapStatus />
    </MapboxMap>
  </div>
</template>

API

useMap()

注入当前地图上下文,返回 MapboxContext。无参数。

返回 MapboxContext

id
string
地图 id,未显式指定时为内部生成的唯一值。
map
ShallowRef<Map | undefined>
地图实例引用;SSR 与挂载前为 undefined
isLoaded
Ref<boolean>
样式是否已加载完成。
whenLoaded
() => Promise<Map>
样式首次加载完成时 resolve,返回地图实例。
onReady
(cb: (map: Map) => void) => () => void
样式就绪即执行回调,且每次 setStyle 重新加载后重跑(用于重建 source / layer);返回取消订阅函数。

Changelog

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