React-leaflet LayersControl выдает ошибку при перемещении кода в функцию

#javascript #reactjs #leaflet #react-leaflet

#javascript #reactjs #листовка #react-leaflet

Вопрос:

Извините, если на это был дан ответ где-то еще раньше! Я новичок в react-leaflet и уже некоторое время борюсь с этой проблемой.

Следующий код не компилируется, и инструменты разработчика Chrome сообщают мне: 3 ошибки на этой странице:
1) «TypeError: addOverlay не является функцией»,
2) «TypeError: addOverlay не является функцией» и «,
3) «TypeError: this.props.removeLayer не являетсяфункция».

Чего я не понимаю: если я закомментирую компонент «TestOverlay», он компилируется. Кажется, происходит какое-то волшебство с помещением кода в функцию, но я понятия не имею, в чем проблема..

Использование: «leaflet»: «1.7.1», «react»: «16.14.0», «react-dom»: «16.14.0», «react-leaflet»: «2.7.0»,

Большое спасибо за помощь!

 import React from "react";
import { Map, TileLayer, LayersControl, Marker, LayerGroup } from "react-leaflet";

import "./App.css";

function TestOverlay() {
  return <LayersControl.Overlay checked name="Random layer 2">
  <Marker position={[52.339545, 4.900526]} />
</LayersControl.Overlay>;

}

export default function App() {
  return (
    <Map center={[52.339545, 4.900526]} zoom={14}>
      <TileLayer
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        attribution='amp;copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
      />
      <LayersControl position="topright">
        <LayersControl.Overlay checked name="Random layer">
          <Marker position={[52.339545, 4.900526]} />
        </LayersControl.Overlay>
        <TestOverlay/>
      </LayersControl>
    </Map>);
}
 

Ответ №1:

Из documentation1, documentation2

Map: компонент верхнего уровня, создающий экземпляр карты листовки и предоставляющий ее своим дочерним элементам.

Все компоненты являются оболочками React для элементов и слоев листовки, им нужен экземпляр map и, следовательно, они должны быть включены в компонент верхнего уровня.

LayersControl.Overlay использует класс Overlay( doc), а внутри класса Overlay есть следующий код:

  class Overlay extends ControlledLayer {
  constructor(props: ControlledLayerProps) {
    super(props)
    this.contextValue = {
      ...props.leaflet,
      layerContainer: {
        addLayer: this.addLayer.bind(this),
        removeLayer: this.removeLayer.bind(this),
      },
    }
  }

  addLayer = (layer: Layer) => {
    this.layer = layer // Keep layer reference to handle dynamic changes of props
    const { addOverlay, checked, name } = this.props
    addOverlay(layer, name, checked)
  }
}
 

в конструкторе addLayer назначается метод, который является this.addLayer .
внутри this.addLayer addOverlay происходит деструктуризация с помощью реквизитов. Скорее всего, в этот момент props не содержат метода addOverlay и, следовательно, не могут быть извлечены, поэтому возникает ошибка.

В результате вы не можете использовать LayersControl.Overlay то, что пытаетесь. Такого примера нет, и я думаю, что это невозможно, поскольку экземпляр map предоставлен не так, как должен LayersControl.Overlay

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

1. первые две ссылки documentation1, documentation2-> страница не найдена.

2. Это связано с тем, что владелец библиотеки изменил URL-ссылки и их содержимое в связи с выпуском новой версии, и теперь они не работают.