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

박병찬*_*박병찬 5 leaflet reactjs

应用程序.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} />
    </>
  );
};
Run Code Online (Sandbox Code Playgroud)

地图.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;
Run Code Online (Sandbox Code Playgroud)

地图文件

.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%;
}
Run Code Online (Sandbox Code Playgroud)

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

0xn*_*oob 16

除了 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;
}
Run Code Online (Sandbox Code Playgroud)

地图.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>
  );
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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>
  );
};
Run Code Online (Sandbox Code Playgroud)

  • 您好,欢迎来到 Stack Overflow!回答问题时,请添加一些评论,以便提问者和其他读者理解您的解决方案。 (3认同)