React-Google-Map многократное окно информации открыто

В настоящее время я создаю API-интерфейс Google Map с использованием response-google-maps и хотел бы создать несколько маркеров для отображения информации о городах по всему миру в информационном окне. Но так как они все из html-объекта. Всякий раз, когда я нажимаю на один маркер, все информационные окна будут открыты. Если есть способ это исправить? Образец кода:

<GoogleMap
    defaultZoom={3}
    defaultCenter={{ lat: 40.452906, lng: 190.818206 }}
  >
    <Marker id = "mark1"
      options={{icon: Mark1}} 
      position={{ lat: 34.4076645, lng: 108.742099 }}
      onClick={props.onToggleOpen}
    >
      {props.isOpen && <InfoWindow id = "info1"
                    onCloseClick={props.onToggleOpen}
                    >
                    <div> content1 </div>
      </InfoWindow>}
    </Marker>
    <Marker
      options={{icon: Mark2}} 
      position={{ lat: 35.6958783, lng: 139.6869534 }}
      onClick={props.onToggleOpen}
    >
      {props.isOpen && <InfoWindow
                    onCloseClick={props.onToggleOpen}
                    >
                    <div> content2 </div>
      </InfoWindow>}
    </Marker>
</GoogleMap>

1 ответ

В вашем коде onClick из Marker просто позвони {props.onToggleOpen}, который я надеюсь переключает флаг. Здесь вы должны отправить маркер, на который вы нажимаете, поэтому вам нужно изменить onClick что-то вроде ниже

onClick={() => { props.onToggleOpen("mark1"); }}

В приведенной выше строке Mark1 должно быть уникальным значением, которое вы можете использовать для определения соответствующего Marker, Вы можете заменить это идентификатором маркера или чем-то, что будет уникальным для соответствующего Marker,

Во-вторых, вам нужно изменить onToggleOpen переключить флаг для соответствующего marker который определяется аргументом, который он получает (уникальное значение, которое вы отправляете из `onClick). Вы можете использовать массив, такой как структура данных, для хранения этого значения.

Тогда вам нужно показать свои InfoWindow на основе флага, соответствующего Marker, принимая во внимание isOpen будет массивом флагов (после включения вышеупомянутых изменений), можно было бы показать InfoWindow используя условие что-то вроде ниже

<Marker id = "mark1"
  options={{icon: Mark1}} 
  position={{ lat: 34.4076645, lng: 108.742099 }}
  onClick={() => { props.onToggleOpen("mark1"); }}
>
  {props.isOpen["mark1"] && <InfoWindow id = "info1"
                onCloseClick={() => { props.onToggleOpen("mark1"); }}
                >
                <div> content1 </div>
  </InfoWindow>}
</Marker>

Надеюсь, что это приведет вас в правильном направлении.

Другие вопросы по тегам