Open dannyng1988 opened 1 year ago
I had the same problem. I was able to fix in my implementation by splitting in two components and using memo
avoiding some infinite update state/re-rendering happening on the GoogleMap
component, here is the code:
import { DirectionsRenderer, GoogleMap } from '@react-google-maps/api';
import React, { memo, useState } from 'react';
export interface GoogleMapsDirectionsProps {
origin: {
lat: number;
lng: number;
};
destination: {
lat: number;
lng: number;
};
}
export const GoogleMapsDirections = memo(
({ origin, destination }: GoogleMapsDirectionsProps) => {
const DirectionsService = new google.maps.DirectionsService();
return (
<GoogleMap
id="google-map"
mapContainerStyle={{
borderRadius: '0.625rem',
height: '100%',
width: '100%',
}}
center={{
lat: destination.lat,
lng: destination.lng,
}}
zoom={10}
>
<DirectionsRendererWrapper
origin={origin}
destination={destination}
directionsService={DirectionsService}
/>
</GoogleMap>
);
},
);
export interface DirectionsRendererWrapperProps {
origin: {
lat: number;
lng: number;
};
destination: {
lat: number;
lng: number;
};
directionsService: google.maps.DirectionsService;
}
const DirectionsRendererWrapper = memo(
({
destination,
origin,
directionsService,
}: DirectionsRendererWrapperProps) => {
const [directions, setDirections] =
useState<google.maps.DirectionsResult | null>(null);
React.useEffect(() => {
directionsService.route(
{
origin,
destination,
travelMode: google.maps.TravelMode.DRIVING,
},
(result, status) => {
if (status === google.maps.DirectionsStatus.OK) {
setDirections(result);
} else {
console.error(`error fetching directions ${result}`);
}
},
);
}, [origin, destination, directionsService]);
if (!directions) {
return null;
}
return (
<DirectionsRenderer
options={{
directions: directions,
}}
/>
);
},
);
🍻
Also reported on https://github.com/JustFly1984/react-google-maps-api/issues/3256
mapContainerStyle, center and DirectionsService should be wrapped in useMemo!
options for DirectionsRenderer should be wrapped into useMemo too!
also save component into intermediate const before passing it into React.memo
Please check out the directionsrenderer code example. The map keeps refreshing when you choose driving route.
https://react-google-maps-api-docs.netlify.app/#directionsrenderer