reactjs 如何更改Leaflet v3 React中的Map大小(不变属性)

ctehm74n  于 2023-03-12  发布在  React
关注(0)|答案(2)|浏览(138)

我一直在阅读v3中的更改日志,我看到了几个更改。
Map组件被MapContainer替换,行为不同,除了 prop 是不可变的以外,我想创建一个MapContainer,并能够动态更新宽度和高度,例如当我的用户最小化窗口或当组件大小更改时。
我如何才能做到这一点,而不杀死MapContainer和创建其他新的??

<MapContainer whenCreated={...} style={{width:xxx, height:yyy}}
bvjxkvbb

bvjxkvbb1#

我在迁移到react-leaflet v3.x后遇到了同样的问题
因此,我通过使用react-leafletuseMap钩子做了一个小把戏,并成功地尝试了根据容器(无论它是什么,也无论它是窗口)调整Map的大小。
因此,我的Map Container代码如下所示:

function SetHeightOnChange({ height }) {
    const map = useMap();

    const mapContainer = map.getContainer();
    mapContainer.style.cssText = `height: ${height}px; width: 100%; position: relative;`;

    return null;
  }

  return (
    <MapContainer
      center={center}
      zoom={13}
      style={{
        height: height + "px",
        width: "100%",
      }}
    >
      <TileLayer
        attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
      />
      <CircleMarker center={position}>
        <Popup>
          A pretty CSS3 popup. <br /> Easily customizable.
        </Popup>
      </CircleMarker>
      <SetHeightOnChange height={height} />
    </MapContainer>
  );

**请注意:**对于Mapwidth,您所需要的只是将其设置为100%

还请注意MapContainer中的子组件,我将其命名为SetHeightOnChange(确保将该子组件放在Marker标记之后)。
现在,无论何时,只要您在任何调整大小更改后触发高度值更新,您的Map大小将相应地更改。

exdqitrt

exdqitrt2#

使用Map的“invalidateSize”函数:

const { height } = useSize(container);
useEffect(() => {
  if (map != null) {
    map.invalidateSize();
  }
}, [map, height]);

您可以将其放在map的子项中(如另一个答案中所述),也可以放在父项中(将map作为MapContainer上的ref),两种方式都可以。
MapContainer只需要静态样式:

width: 100%;
height: 100%;

不再有问题(最终)

相关问题