mcpField
R
react-google-maps

react-google-maps

github.com/horuz-ai开发541 次安装39 周前更新
代码仓库

关于 react-google-maps

react-google-maps 是用于 Google Maps JavaScript API 的 React 库,由 vis.gl 维护并获 Google 赞助。它提供地图组件与钩子,并附有常见地图模式的参考资料。

主要功能

  1. 01地图与标记的 React 组件
  2. 02地图及地图库钩子
  3. 03地图和事件的 TypeScript 类型
  4. 04Places 与 Geocoding 指南
  5. 05交互式地图模式示例

适用场景

  1. 01在 React 应用中嵌入 Google 地图
  2. 02显示带信息窗口的标记
  3. 03构建可拖动标记并同步圆形区域
  4. 04实现 Places 或 Geocoding 界面

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/horuz-ai/claude-plugins --skill react-google-maps

安装后在 Claude Code 中输入/react-google-maps确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
components-api.md
geometry-components.md
hooks-api.md
patterns.md
places-autocomplete.md

详细介绍

@vis.gl/react-google-maps

Google Maps JavaScript API 的官方 React 库,由 vis.gl 维护并由 Google 赞助。

快速开始

import { APIProvider, Map, AdvancedMarker, Pin } from '@vis.gl/react-google-maps';

function App() {
  return (
    <APIProvider apiKey={process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY!}>
      <Map
        style={{ width: '100%', height: '400px' }}
        defaultCenter={{ lat: 18.4655, lng: -66.1057 }}
        defaultZoom={12}
        mapId="YOUR_MAP_ID" // Required for AdvancedMarker
      >
        <AdvancedMarker position={{ lat: 18.4655, lng: -66.1057 }}>
          <Pin background="#0f9d58" borderColor="#006425" glyphColor="#60d98f" />
        </AdvancedMarker>
      </Map>
    </APIProvider>
  );
}

安装

npm install @vis.gl/react-google-maps

主要导出

// Components
import {
  APIProvider,      // Wraps app, loads Maps JS API
  Map,              // Map container
  AdvancedMarker,   // Modern marker (requires mapId)
  Pin,              // Customizable pin for AdvancedMarker
  InfoWindow,       // Popup windows
  MapControl,       // Custom controls on map
  Marker,           // Legacy marker (deprecated)
} from '@vis.gl/react-google-maps';

// Hooks
import {
  useMap,                  // Access google.maps.Map instance
  useMapsLibrary,          // Load additional libraries (places, geocoding, drawing)
  useAdvancedMarkerRef,    // Connect marker to InfoWindow
  useApiIsLoaded,          // Check if API is loaded
} from '@vis.gl/react-google-maps';

// Enums
import {
  ControlPosition,     // For MapControl positioning
  CollisionBehavior,   // For marker collision handling
} from '@vis.gl/react-google-maps';

关键要求

  1. AdvancedMarker 必须设置 mapId — 在 Google Cloud Console > Maps > Map Styles 中创建
  2. APIProvider 必须包裹所有地图组件 — 放在应用根目录或布局层级
  3. 不会导出 Circle、Polygon、Polyline — 实现方式请参阅 references/geometry-components.md
  4. places.Autocomplete 已弃用(2025 年 3 月)— 请改用 AutocompleteService,并搭配自定义 UI

参考文件

根据任务阅读以下文件:

任务参考文件
地图、Marker、InfoWindow、Pin 详情references/components-api.md
useMap、useMapsLibrary、钩子references/hooks-api.md
Circle、Polygon、Polylinereferences/geometry-components.md
Places Autocomplete、Geocodingreferences/places-autocomplete.md
可拖动标记 + 实时同步、受控地图references/patterns.md

常见模式

带 InfoWindow 的标记
const MarkerWithInfo = ({ position }: { position: google.maps.LatLngLiteral }) => {
  const [markerRef, marker] = useAdvancedMarkerRef();
  const [open, setOpen] = useState(false);

  return (
    <>
      <AdvancedMarker ref={markerRef} position={position} onClick={() => setOpen(true)} />
      {open && (
        <InfoWindow anchor={marker} onClose={() => setOpen(false)}>
          <p>Hello!</p>
        </InfoWindow>
      )}
    </>
  );
};
可拖动标记与实时 Circle 同步
const DraggableWithCircle = () => {
  const [position, setPosition] = useState({ lat: 18.4655, lng: -66.1057 });

  return (
    <>
      <AdvancedMarker
        position={position}
        draggable
        onDrag={(e) => {
          // Updates DURING drag for real-time sync
          if (e.latLng) setPosition({ lat: e.latLng.lat(), lng: e.latLng.lng() });
        }}
      />
      <Circle center={position} radius={1000} /> {/* Follows marker in real-time */}
    </>
  );
};
自定义地图控件
<Map {...props}>
  <MapControl position={ControlPosition.TOP_LEFT}>
    <button onClick={handleClick}>Custom Button</button>
  </MapControl>
</Map>

TypeScript 类型

// Position types
type LatLngLiteral = { lat: number; lng: number };
type LatLngAltitudeLiteral = { lat: number; lng: number; altitude: number };

// Event types
type MapMouseEvent = google.maps.MapMouseEvent;
type AdvancedMarkerClickEvent = google.maps.marker.AdvancedMarkerClickEvent;

// Library types (from useMapsLibrary)
type PlacesLibrary = google.maps.PlacesLibrary;
type GeocodingLibrary = google.maps.GeocodingLibrary;
type DrawingLibrary = google.maps.DrawingLibrary;

评论

支持 Markdown