react-google-maps / api Избегает повторного отображения карты после некоторых изменений состояния

#javascript #reactjs #jsx #react-google-maps

#javascript #reactjs #jsx #react-google-maps

Вопрос:

У меня возникали проблемы, когда мой экземпляр GoogleMaps обновлялся и самоцентрировался на некоторой onClick функции, в которой устанавливалось состояние, и выполнялся весь цикл рендеринга компонента.

После некоторого поиска в Google было предложено разделить и повторно использовать создание экземпляра компонента. Проблема сейчас в том, что у меня есть некоторая логика для отображения маркеров внутри <GoogleMaps> компонента, который больше не работает должным образом, и я не знаю, как провести рефакторинг:

 export default function LocationSearchResults({
    ...
    }) {
    const [map, setMap] = useState(null)
    const [markersContainer, setMarkersContainer] = useState([])

    const getMap = () => {

        if (map) {
            return map;
        } else {
            setMap(<GoogleMap mapContainerStyle={containerStyle}
                options={ {
                        minZoom: 3,
                        maxZoom: 15
                    }}
                center={{
                        lat: 49.25,
                        lng: -84.5
                    }}
                zoom={5}
                onLoad={onLoad}
                onDragEnd={onDragEnd} >
                {
                    markersContainer.map(place => { //Only executes once? Does not listen for changes
                        return (< Marker key={place.id}
                            position={ place.position}
                        />
                        )
                    })

                }

                </GoogleMap>

                )

                return map

            }
        }

        render( <div className="..." >
                    {
                     getMap()
                    } 
            </div>
        )
    }
  

У меня нет большого опыта работы с React, любая помощь приветствуется, спасибо!

Ответ №1:

Я настроил создание экземпляра моего компонента следующим образом, используя useMemo

 ...instantiate all event listener functions here

const map = useMemo(() =>
 {
   return (<GoogleMap
    mapContainerStyle={containerStyle}
    options={{ minZoom: 3, maxZoom: 15 }}
    center={{
      lat: 49.25,
      lng: -84.5
    }
    }
    zoom={5}
    onLoad={onLoad}
    onDragEnd={onDragEnd}
  // onUnmount={onUnmount}
  >
     {markersContainer.map(place => { return ( <Marker
                    key={place.id}
                    position={place.position} />
                    )
                   })
    }
 </GoogleMap>)

}, [markersContainer])
  

затем я просто выполняю рендеринг в своей функции render ():

 return (
    <>
<div>...
  {map}
</div>
</>)
  

Больше никаких ненужных обновлений, если новые маркеры не будут добавлены / удалены.