Я пытаюсь использовать MapBox-GL с React. Я пытаюсь избежать использования обертки.
Я успешно создал карту с помощью компонентов класса, но хочу преобразовать ее, чтобы использовать только функции, чтобы использовать преимущества хуков. Отображение карты в функции прекрасно работает:
const map = () => {
new mapboxgl.Map({
container: 'mapContainer',
style: 'mapbox://styles/mapbox/light-v9',
center: [7.32, 60.44],
zoom: 6,
})
};
const Map = () => {
const style = {
position: 'absolute',
top: 0,
bottom: 0,
width: '100%',
height: '100vh'
};
useEffect(()=>{
map();
});
return (
<Row type = "flex" gutter = "50">
<Col xs = {{ span: 18 }}>
<div style = {style} id = "mapContainer" />
</Col>
</Row>
);
}
Однако я хочу добавить контроллеры и что-то делать с картой. Обычно я делаю это в ComponentDidMount().
Я пытался добавить map.addControl(geocoder);, например, в useEffect, а также вне функции Map. Я получаю только ошибки:
TypeError: map.addControl is not a function



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Аналогом componentDidMount является useEffect с нулевыми входами.
map.addControl(geocoder) предполагает, что map является экземпляром Map, хотя это функция и не возвращает значение.
Должен быть:
const getMap = () => {
return new mapboxgl.Map({ ... })
};
const Map = () => {
useEffect(()=>{
const map = getMap();
map.addControl(geocoder);
}, []);
...
};
Чудесно! Большое спасибо!