React google maps / api: как сфокусироваться на позиции маркера с помощью масштабирования на основе результатов поиска?

#reactjs #react-google-maps-api

#reactjs #реагировать-google-maps-api

Вопрос:

Мне нужно сосредоточиться на маркере на основе динамических результатов поиска.
Насколько я понял из других обсуждений, мне нужно использовать panTo функцию.
Я попробовал, и это работает частично. Вот пример кода и ссылка codesandbox
Note: Укажите свой ключ Google Maps в .env файле для тестирования codesandbox.

Map.js

 import { GoogleMap, LoadScript, Marker } from "@react-google-maps/api";
import React, { useEffect } from "react";

const containerStyle = {
  width: "100%",
  height: "500px"
};

const center = { lat: 45.4211, lng: -75.6903 };
const Maps = ({ filteredPark }) => {
  const key = process.env.REACT_APP_GOOGLE_KEY; //test with your key please

  if (!key) {
    throw new Error("Google token is not set");
  }

  const mapRef = React.useRef();
  const onMapLoad = React.useCallback((map) => {
    mapRef.current = map;
  }, []);

  const panTo = React.useCallback(({ lat, lng }) => {
    mapRef?.current?.panTo({ lat, lng });
    mapRef?.current?.setZoom(18);
  }, []);

  useEffect(() => {
    filteredPark.map((a) => {
      const lat = a.coordinates[1];
      const lng = a.coordinates[0];
      return panTo({ lat, lng });
    });
  }, [filteredPark, panTo]);

  return (
    <div style={{ width: "100%", height: "100%" }}>
      <LoadScript googleMapsApiKey={key}>
        <GoogleMap
          mapContainerStyle={containerStyle}
          center={center}
          zoom={6}
          onLoad={onMapLoad}
        >
          {filteredPark amp;amp;
            filteredPark.map((park) => (
              <Marker
                key={park.PARK_ID}
                position={{
                  lat: park.coordinates[1],
                  lng: park.coordinates[0]
                }}
              />
            ))}
        </GoogleMap>
      </LoadScript>
    </div>
  );
};

export default React.memo(Maps);
 

пользовательский компонент поиска

 import { useMemo } from "react";
import * as parkData from "./data/skateboard-parks.json";

const useParkFIlter = (DESCRIPT_1) => {
  const gridRows = parkData.features.map((park) => park.properties);

  const filteredParks = useMemo(() => {
    return (
      gridRows amp;amp;
      gridRows.filter((dispo) =>
        dispo.DESCRIPT_1.toLowerCase().includes(DESCRIPT_1.toLowerCase())
      )
    );
  }, [DESCRIPT_1, gridRows]);

  return [filteredParks];
};

export default useParkFIlter;

 

Любая помощь будет оценена.

Ответ №1:

Я внес изменения в ваш код. Если это не сработает, дайте мне знать.

  import { GoogleMap, LoadScript, Marker } from "@react-google-maps/api";
        import React, { useEffect } from "react";
    
    const containerStyle = {
      width: "100%",
      height: "500px"
    };
    
    const center = { lat: 45.4211, lng: -75.6903 };
    const Maps = ({ filteredPark }) => {
      const key = process.env.REACT_APP_GOOGLE_KEY; //test with your key please
    
      if (!key) {
        throw new Error("Google token is not set");
      }
    
      //const mapRef = React.useRef();
      const [mapInstance, setMapInstance] = useState(null);
      const[zoom, setZoom] = useState(6);
      const onMapLoad = React.useCallback((map) => {
      //mapRef.current = map;
      setMapInstance(map);
      }, []);
    
      //const panTo = React.useCallback(({ lat, lng }) => {
        //mapRef?.current?.panTo({ lat, lng });
        //mapRef?.current?.setZoom(18);
      //}, []);
  

      useEffect(()=>{
           if(mapInstance){
               mapInstance.panTo({ lat, lng });
               setZoom(18);
           }
      },[mapInstance]);
    
      useEffect(() => {
        filteredPark.map((a) => {
          const lat = a.coordinates[1];
          const lng = a.coordinates[0];
          return panTo({ lat, lng });
        });
      }, [filteredPark, panTo]);
    
      return (
        <div style={{ width: "100%", height: "100%" }}>
          <LoadScript googleMapsApiKey={key}>
            <GoogleMap
              mapContainerStyle={containerStyle}
              center={center}
              //zoom={6}
              zoom={zoom}
              onLoad={onMapLoad}
            >
              {filteredPark amp;amp;
                filteredPark.map((park) => (
                  <Marker
                    key={park.PARK_ID}
                    position={{
                      lat: park.coordinates[1],
                      lng: park.coordinates[0]
                    }}
                  />
                ))}
            </GoogleMap>
          </LoadScript>
        </div>
      );
    };
    
    export default React.memo(Maps);