在 React 项目中部分加载的传单地图

Som*_*ive 3 leaflet reactjs webpack

我正在尝试在 react 组件中实现一个简单的 Leaflet 地图。由于某种原因,地图的图块没有加载或以随机顺序加载。有没有其他人经历过这种情况?

这是应用程序的 CodeSandbox:https ://codesandbox.io/s/3qmp8x4131

这是代码:

import React from "react";
import ReactDOM from "react-dom";
import * as L from "leaflet";

export default class Map extends React.Component {
  map = null;
  componentDidMount() {
    var map = (this.map = L.map(ReactDOM.findDOMNode(this), {
      minZoom: 2,
      maxZoom: 20,
      layers: [
        L.tileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
          attribution:
            '&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'
        })
      ],
      attributionControl: false
    }));

    map.on("click", this.onMapClick);
    map.fitWorld();
  }

  componentWillUnmount() {
    if (!this.map) return;
    this.map.off("click", this.onMapClick);
    this.map = null;
  }

  onMapClick = () => {
    // Do some wonderful map things...
  };

  render() {
    return <div className="map" />;
  }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

ghy*_*ybs 5

  1. 您确实忘记包含 Leaflet CSS 文件。
  2. 您错误地指定了.map容器高度。

1. 包含传单 CSS

请注意您在评论中提到的工作示例如何导入 Leaflet 资产(在Map/leaflet.js文件中):

import L from 'leaflet'; // Same as `import * as L from 'leaflet'` with webpack
import 'leaflet/dist/leaflet.css';
Run Code Online (Sandbox Code Playgroud)

请注意,它显式导入 Leaflet CSS 文件。当它丢失时,您的磁贴会出现乱序并散布在您的页面上。

当它们在 JS 文件中被引用时,Webpack 有一个style-loadercss-loader来正确管理这些 CSS 资产。

2.指定地图容器高度

在失败的代码示例中,您<div class="map">使用 CSS指定容器:

.map {
  height: 100%;
}
Run Code Online (Sandbox Code Playgroud)

请注意,百分比值基于元素的父节点值,即在本例中为父节点高度的 100%。

您的 DOM 层次结构是:

<html>
  <body>
    <div id="root">
      <div class="App">
        <div class="map">
Run Code Online (Sandbox Code Playgroud)

可是你有没有指定任何地图容器的祖先的高度(即htmlbody#root.App)。由于他们唯一的孩子是.map,他们没有其他任何东西可以增加他们的大小,因此他们的身高为 0。

而你.map的高度是 0 的 100%,即 0。

确保您还为每个祖先指定了高度值:

html,
body,
#root,
.App {
  margin: 0;
  height: 100%;
}
Run Code Online (Sandbox Code Playgroud)

或者为您的地图容器使用明确的高度值,例如在px.

更新 CodeSandbox:https ://codesandbox.io/s/zn89pkmn83