当中心状态改变时,React 传单中心属性不会改变

IT技术 reactjs leaflet
2021-03-31 10:06:34

应用程序.js

import { useState } from 'react';

const App = () => {
  // This state is used to the center attribute of MapContainer component
  const [mapCenter, setMapCenter] = useState([34.80746, -40.4796]);
  // This state is used to the zoom attribute of MapContainer component
  const [mapZoom, setMapZoom] = useState(3);

  const onClickHandler = () => {
    setMapCenter([20, 100]);
    setMapZoom(5);
  };

  return (
    <>
      <button onClick={onClickHandler}>Change map's center location</button>
      <Map center={mapCenter} zoom={mapZoom} />
    </>
  );
};

地图.js

import React from 'react';
import './Map.css';
import { MapContainer, TileLayer } from 'react-leaflet';

function Map({ center, zoom }) {
  return (
    <div className="map">
      <MapContainer center={center} zoom={zoom}>
        <TileLayer
          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
          attribution='&copy; <a 
                href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        />
      </MapContainer>
    </div>
  );
}

export default Map;

地图文件

.map {
  height: 500px;
  background-color: white;
  padding: 1rem;
  border-radius: 20px;
  margin-top: 16px;
  box-shadow: 0 0 8px -4px rgba(0, 0, 0, 0.5);
}

.map .leaflet-container {
  height: 100%;
}

当我单击按钮时,mapCenter 状态明显更改为 [20, 100] 并且 mapZoom 也更改为 5。但是在 Map Component Map 中没有显示新的中心。但我不知道为什么。我已经检查了状态的变化。地图从不响应。有人知道吗???请回答一个弄清楚的方法。

2个回答

除了 its childrenMapContainerprops 是不可变的:在第一次设置后更改它们不会对 Map 实例或其容器产生影响。由 MapContainer 元素创建的 Leaflet Map 实例可以由使用提供的钩子之一或 MapConsumer 组件的子组件访问。
https://react-leaflet.js.org/docs/api-map

更改视图.js

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

地图.js

function Map({ center, zoom }) {
  return (
    <div className="map">
      <MapContainer center={center} zoom={zoom} scrollWheelZoom={false}>
        <ChangeView center={center} zoom={zoom} /> 
        <TileLayer
          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        />
      </MapContainer>
    </div>
  );
}

react-leaflet 文档setCenter在其useMapEvent 示例中使用,但未定义此函数。但是,在传单文档中,修改地图状态的方法有一个功能setView(center, zoom, options?)

@Banny 在获得中心坐标之前,您可以渲染其他内容。例如(如加载动画)
2021-05-31 10:06:34
它很有帮助。谢谢您的回答。我终于解决了。
2021-06-19 10:06:34
const Map = ({ center, zoom }) => {
  const [map, setmap] = useState(null);
  if (map) {
    map.flyTo(center);
  }
  return (
    <div className="map">
      <LeafletMap
        center={center}
        zoom={zoom}
        whenCreated={setmap}
        scrollWheelZoom={false}
      >
        <TileLayer
          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        ></TileLayer>
      </LeafletMap>
    </div>
  );
};
您好,欢迎来到 Stack Overflow!在回答问题时,请包括一些评论,以便提问者和其他读者理解您的解决方案。
2021-06-19 10:06:34