【问题标题】:React-Leaflet Map doesn't updateReact-Leaflet Map 不更新
【发布时间】:2021-02-20 11:53:52
【问题描述】:

我的问题是 react-leaflet <MapContainer> 没有以我动态设置的位置为中心。 基本逻辑是我有一个表格,我在其中输入街道和门牌号码,然后调用 Nominatim 并获取一些 JSON 格式的数据,从中提取建筑物的纬度和经度。 我将这些经纬度传递给我的<MapContainer>,但它无论如何都没有响应。 使用 react-leaflet v2 运行良好,但在我更新到 v3 后它停止了。

每当我设置默认位置值时,MapContainer 都会以该位置为中心。但是当我通过 Nominatim 调用动态传递另一个值时它不起作用。

我在这里呼吁提名:

const getSearchData = async () => {
    const exampleReq = `https://nominatim.openstreetmap.org/search/${query}?format=json&building=*&addressdetails=1&limit=1&polygon_geojson=1`;
    const response = await fetch(exampleReq);
    const data = await response.json();
    // console.log(data);
    if (data === undefined || data.length === 0) {
        // array empty or does not exist
        console.log("data array is empty");
        alert("Given address unrecognized! Try again please.")
        setLatitude(DEFAULT_LATITUDE);
        setLongitude(DEFAULT_LONGITUDE);
    }else{
        setLatitude(data[0].lat);
        setLongitude(data[0].lon);
    }
};

这是我的表单提交:

<form className={style.searchForm} onSubmit={e => {
                e.preventDefault();
                setQuery(street + " " + houseNumber.replace(/\//g, "-") + ", Tallinn");
                setPosition({
                    ltd: lat, 
                    lng: long
                });

这是我的 MapBox 组件,其中包含我的传单地图:

const MapBox = (props) => {

  useEffect(()=>{
      console.log("MAPBOX!");
      console.log("updateMap() - lat ---> " + props.latitude);
      console.log("updateMap() - long ---> " + props.longitude);
      updateMap();
  },[props.street, props.houseNumber]);

  const passStreet = props.street;
  const passHouseNumber = props.houseNumber;

  const updateMap = () => {
    // console.log("updateMap() - lat ---> " + props.latitude);
    // console.log("updateMap() - long ---> " + props.longitude);
    return(
        <MapContainer center={[props.latitude, props.longitude]} zoom={20}>
            <TileLayer
                url='https://{s}.tile.osm.org/{z}/{x}/{y}.png'
                attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
            />
            <OverpassLayer street={passStreet} houseNumber={passHouseNumber} />
        </MapContainer>
      );
  }

  return(
    updateMap()
  );
}

【问题讨论】:

    标签: javascript reactjs leaflet openstreetmap react-leaflet


    【解决方案1】:

    我能够解决它。在文档中它被声明为:

    除了它的子元素,MapContainer 的 props 是不可变的:在它们第一次设置后更改它们不会对 Map 实例或其容器产生任何影响。 由 MapContainer 元素创建的 Leaflet Map 实例可以由子组件使用提供的钩子之一或 MapConsumer 组件访问。

    这段代码有助于理解:

    function MyComponent() {
      const map = useMap()
      console.log('map center:', map.getCenter())
      return null
    }
    
    function MyMapComponent() {
      return (
        <MapContainer center={[50.5, 30.5]} zoom={13}>
          <MyComponent />
        </MapContainer>
      )
    }

    我实现了什么:

    function MyComponent(props) {
    const map = useMap();
    map.setView(props.center, props.zoom);
    return null;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 1970-01-01
      • 2020-01-30
      • 2021-04-22
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多