Перейти к основному содержимому

Работа с React

Вы можете работать с картой MapGL JS API в проектах на React. Обратите внимание на следующие инструкции:

Примечание

Вы можете воспользоваться шаблоном React-проекта.


Повторный рендеринг

Возьмём для примера простое приложение на React:

import React from 'react';
import ReactDOM from 'react-dom';

import { App } from './App';

const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);

С простым компонентом App:

import React from 'react';

export const App = () => {
return <div>My App</div>;
};

Чтобы добавить в это приложение карту, создадим новый компонент:

import { load } from '@2gis/mapgl';

export const Map = () => {
useEffect(() => {
let map;
load().then((mapglAPI) => {
map = new mapglAPI.Map('map-container', {
center: [55.31878, 25.23584],
zoom: 13,
key: 'Your API access key',
});
});

// Удаляем карту при размонтировании компонента
return () => map && map.destroy();
}, []);

return (
<div style={{ width: '100%', height: '100%' }}>
<MapWrapper />
</div>
);
};

Обратите внимание, что в этом компоненте нет контейнера карты (map-container). Чтобы избежать повторного рендеринга карты, мы создадим отдельный компонент, который будет использовать React.memo:

const MapWrapper = React.memo(
() => {
return <div id="map-container" style={{ width: '100%', height: '100%' }}></div>;
},
() => true,
);

Второй аргумент React.memo - функция, которая определяет, можно ли использовать последний результат рендеринга, избегая таким образом повторного рендеринга. В нашем случае эта функция будет всегда возвращать true.

Осталось добавить карту в компонент App и всё готово к работе:

export const App = () => {
return (
<div style={{ width: '100%', height: 400 }}>
<Map />
</div>
);
};

Полный исходный код можно найти в примере ниже.

Получение доступа к карте

Второй частый сценарий использования - получение доступа к карте из другого компонента.

В качестве примера можно взять кнопку, которая меняет центр карты. Если эта кнопка будет расположена в отдельном компоненте, то нужно из этого компонента получить доступ к компоненту с картой. Для этого можно использовать React Context API.

Для начала создадим новый компонент и вызовем React.createContext(), чтобы создать объект Context.

const MapContext = React.createContext([undefined, () => {}]);
const MapProvider = (props) => {
const [mapInstance, setMapInstance] = React.useState();

return (
<MapContext.Provider value={[mapInstance, setMapInstance]}>
{props.children}
</MapContext.Provider>
);
};

Затем обернём компонент App компонентом MapProvider. Это позволит использовать созданный объект Context в компоненте App и всех дочерних компонентах.

ReactDOM.render(
<MapProvider>
<App />
</MapProvider>,
rootElement,
);

Теперь после создания карты мы можем использовать Context, чтобы сохранить ссылку на карту:

export const Map = () => {
const [_, setMapInstance] = React.useContext(MapContext);

useEffect(() => {
let map;
load().then((mapglAPI) => {
map = new mapglAPI.Map('map-container', {
center: [55.31878, 25.23584],
zoom: 13,
key: 'Your API access key',
});

// Сохраняем ссылку на карту
setMapInstance(map);
});

// Удаляем карту при размонтировании компонента
return () => map && map.destroy();
}, []);

return (
<div style={{ width: '100%', height: '100%' }}>
<MapWrapper />
</div>
);
};

Сохранённую ссылку можно использовать в других компонентах приложения. Например, создадим кнопку, которая будет менять центр карты:

export const MoveMapButton = () => {
const [mapInstance] = React.useContext(MapContext);

const setInitialCenter = useCallback(() => {
if (mapInstance) {
mapInstance.setCenter([55.31878, 25.23584]);
}
}, [mapInstance]);

return <button onClick={setInitialCenter}>Set initial center</button>;
};

Полный исходный код можно найти в примере ниже.

Готовый пакет npm

Если вы используете npm, вы можете скачать пакет @2gis/mapgl, который также включает поддержку TypeScript.

Примеры использования и другую информацию можно найти в Readme.

Пример использования в стороннем проекте

Пример использования MapGL в стороннем проекте можно посмотреть в репозитории github.com/city-mobil/frontend_react-2gis, где реализована React-обертка. Также доступен npm пакет этой обертки - react-2gis.