Ошибка типа: не удается прочитать свойство ‘getCanvasContainer’ неопределенного значения в проекте React mapbox-gl

#reactjs #mapbox-gl-js #mapbox-gl #mapbox-marker

#reactjs #mapbox-gl-js #mapbox-gl #mapbox-marker

Вопрос:

Я создаю проект React Mapbox с помощью mapboxgl (примечание: не версия оболочки React). До сих пор мне удавалось добавлять то, что я хотел бы, на карту и в свою базу данных, но у меня возникают проблемы с отображением всех данных в виде маркеров / точек / всплывающих окон.

Сообщение, которое я получаю в Chrome, — ошибка типа: не удается прочитать свойство ‘getCanvasContainer’ неопределенного значения.

Мне интересно, связано ли это с самой моей картой (и отсутствием оболочки React для Mapbox) или с координатами. Прямо сейчас я вручную устанавливаю координаты как const coords , но если я этого не сделаю, я получаю сообщение: Ошибка: LngLatLike аргумент должен быть указан как экземпляр LngLat, объект {lng: , lat: }, объект {lon: , lat: } или массив [, ], которыйЯ также не смог решить. Вот часть моего кода для проверки.

 export default class Map extends Component {
    constructor(props) {
        super(props);
        this.state = {
        allBuildings: [],
        lng: 5,
        lat: 45,
        zoom: 3,
        }

        componentDidMount() {
            const map = new mapboxgl.Map({
            container: this.mapContainer,
            style: 'mapbox://styles/mapbox/streets-v11',
            center: [this.state.lng, this.state.lat],
            zoom: this.state.zoom
            });

            map.on('move', () => {
                this.setState({
                lng: map.getCenter().lng.toFixed(4),
                lat: map.getCenter().lat.toFixed(4),
                zoom: map.getZoom().toFixed(4)
                });
                });

            let marker = new mapboxgl.Marker({
                draggable: true,
                color: "blue"
            }).setLngLat([16.40, 50.54]).addTo(map) 


            marker.on('dragend', () => {
                const lngLat = marker.getLngLat();
                this.setState({
                    lng: lngLat.lng,
                    lat: lngLat.lat
                })
            })
            
            this.getMarkers()
            
            }

            getMarkers = () => {
                axios
                .get('/api/add')
                .then(res => {
                        this.setState({
                            allBuildings: res.data
                  res.data.forEach(building => {
                   const popup = new mapboxgl.Popup({ offset: 10})
                   const coords = [building.lng, building.lat]
                  new mapboxgl.Marker({
                       color: 'orange',
                       draggable: false })
                  .setPopup(popup)
                  .setLngLat(building.lng, building.lat)
                  .setHTML(<div>add later</div>)
                  .addTo(this.map)
                  })  
                })
                .catch(err => {
                    console.log(err)
                })
            }
  

Комментарии:

1. Эй, где вы создаете экземпляр this.mapContainer в своем компоненте?, я не вижу его ни в конструкторе, ни где-либо еще. консоль. запишите это.mapContainer, похоже, оно не определено.

2. Привет! Я просто установил контейнер как this.mapContainer. В итоге я извлек вызов данных из функции getMarkers и переместил его в componentDidMount () и добавил только в ‘map’, и это сработало!