Для открытия Popup Marker.openPopup()
можно использовать метод .Следующий компонент демонстрирует, как получить доступ к собственному объекту Marker в библиотеке react-leaflet
и открыть всплывающее окно:
function MarkerExample(props) {
const markerRef = useRef(null);
const { center, content, openPopup } = props;
useEffect(() => {
markerRef.current.leafletElement.openPopup();
}, []);
return (
<CircleMarker ref={markerRef} center={center}>
<Popup>{content}</Popup>
</CircleMarker>
);
}
Вот список изменений для вашего примера:
a) представить отдельный компонентдля маркера, который принимает openPopup
реквизит, чтобы определить, нужно ли открывать всплывающее окно:
function PointMarker(props) {
const markerRef = useRef(null);
const { center, content, openPopup } = props;
useEffect(() => {
if (openPopup) markerRef.current.leafletElement.openPopup();
}, [openPopup]);
return (
<CircleMarker ref={markerRef} center={center}>
<Popup>{content}</Popup>
</CircleMarker>
);
}
b) изменить PointsList
компонент для передачи индекс выбранного элемента через обработчик событий, например:
function PointsList(props) {
const { data, onItemClick } = props;
return (
<div>
<ul>
{data.map((item, index) => (
<li
key={index}
onClick={e => {
onItemClick(index);
}}
>
{item.name}
</li>
))}
</ul>
</div>
);
}
c) И, наконец, в компонент карты введите индекс выбранного маркера как переменную состояния .Теперь при нажатии на внешний элемент обновите выбранный индекс, чтобы открыть всплывающее окно:
function MapExample(props) {
const [selected, setSelected] = useState();
const { zoom, center, locations } = props;
function handleItemClick(index) {
setSelected(index);
}
return (
<div>
<PointsList data={locations} onItemClick={handleItemClick} />
<Map center={center} zoom={zoom}>
<TileLayer url="https://{s}.tile.osm.org/{z}/{x}/{y}.png" />
<PointsLayer selectedIndex={selected} data={locations} />
</Map>
</div>
);
}
Вот демоверсия