reactjs - Google maps info window causing Maximum call stack size exceeded - Stack Overflow

I'm very new to React, I've been trying some things with Google maps.In the below example, w

I'm very new to React, I've been trying some things with Google maps.

In the below example, when I click on a marker the InfoWindow appears, but if I click on another Marker (without closing the InfoWindow), I get a Maximum Maximum call stack size exceeded at Object.keys () error, I cannot work out what's happening.

I've tried debugging, and it seems to be related to the anchor, but I can;t work out how to fix it.

Any help would be appreciated.

import { useCallback, useEffect, useState } from "react";
import { createRoot } from "react-dom/client";

import {
  useMap,
  InfoWindow,
  AdvancedMarkerRef,
} from "@vis.gl/react-google-maps";
import { MarkerClusterer } from "@googlemaps/markerclusterer";

import { ErrorBoundary } from "react-error-boundary";

import { MarkerData } from "./MarkerData";
import MarkerPopupComponent from "./MarkerPopupComponent";
import MarkerContent from "./MarkerContent";

interface Props {
  markers: MarkerData[];
  onRemoveMarker: (id: string) => void; // Callback to remove marker
}

function MarkerClustererComponent({ markers, onRemoveMarker }: Props) {
  const [selectedMarker, setSelectedMarker] = useState<{
    markerRef: AdvancedMarkerRef;
    data: MarkerData;
  } | null>(null);
  const map = useMap();

  useEffect(() => {
    if (!map) return;

    const markerCluster = new MarkerClusterer({ map });

    const markerInstances = markers.map((markerData) => {
      const marker = new google.maps.marker.AdvancedMarkerElement({
        position: { lat: markerData.lat, lng: markerData.lng },
      });

      const container = document.createElement("div");
      const root = createRoot(container); // Create a React root
      root.render(<MarkerContent />);

      marker.content = container;

      marker.addListener("gmp-click", () => {
        console.log("Marker clicked", markerData);
        setSelectedMarker({ markerRef: marker, data: markerData });
      });

      return marker;
    });

    markerCluster.addMarkers(markerInstances);

    return () => {
      markerCluster.clearMarkers();
    };
  }, [map, markers]);

  const handleClose = useCallback(() => {
    setSelectedMarker(null);
  }, []);

  return (
    <>
      {selectedMarker && (
        <ErrorBoundary fallback={<div>Something went wrong</div>}>
          <InfoWindow anchor={selectedMarker.markerRef} onClose={handleClose}>
            <MarkerPopupComponent
              selectedMarker={selectedMarker.data}
              onRemoveMarker={onRemoveMarker}
            />
          </InfoWindow>
        </ErrorBoundary>
      )}
    </>
  );
}

export default MarkerClustererComponent;

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744233338a4564358.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信