react传单地图未正确显示

IT技术 javascript css reactjs leaflet react-leaflet
2021-03-31 23:48:44

我正在尝试用于react-leaflet显示地图。我使用了这个正在工作的小提琴中的代码,但是在我的电脑上我有这个输出

在此处输入图片说明

这是我的代码:

设备映射.js

import React from 'react'
import { Map, Marker, Popup, TileLayer } from 'react-leaflet';

export class DeviceMap extends React.Component {
  constructor() {
    super();
    this.state = {
      lat: 51.505,
      lng: -0.09,
      zoom: 13,
    };
  }

  render() {
    const position = [this.state.lat, this.state.lng];
    return (
      <Map center={position} zoom={this.state.zoom} scrollWheelZoom={false}>
        <TileLayer
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
        />
        <Marker position={position}>
          <Popup>
            <span>A pretty CSS3 popup. <br/> Easily customizable.</span>
          </Popup>
        </Marker>
      </Map>
    );
  }
}

export default DeviceMap

DeviceTabs.js

export class DeviceTabs extends React.Component {
  state = {
    index: 0
  };

  handleTabChange = (index) => {
    this.setState({ index })
  };

  render () {
    return (
      <Tabs index={this.state.index} onChange={this.handleTabChange}>
        <Tab label='Values'>
          <DeviceTable {...this.props} />
        </Tab>
        <Tab label='Map'>
          <div className={style.leaflet}>
            <DeviceMap />
          </div>
        </Tab>
      </Tabs>
    )
  }
}

样式文件

.leaflet {
  height: 300px;
  width: 100%;
}

控制台中没有错误,我不知道在哪里搜索。由于小提琴正在工作,因此它不是错误。我错过了什么 ?

6个回答

看起来您还没有加载 Leaflet 样式表。

来自react-leafletGitHub 指南:

如果您不熟悉 Leaflet,请确保在使用此库之前阅读其快速入门指南。您特别需要将其 CSS 添加到您的页面以正确呈现地图,并设置容器的高度。

http://leafletjs.com/examples/quick-start/

这是您需要的:

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.1/dist/leaflet.css" />

更新

注意@ThomasThiebaud 表示您可能还需要设置高度.leaflet-container

——

Ange Loron 还给出了正确的、可选的、JS module导入(vs cdn 或样式链接)

import 'leaflet/dist/leaflet.css';



就其value而言,文档页面设计得很差……维护者不断在 GitHub 中处理这个问题,但出于某种原因,问题是用户的错误,他们不断地不进行所需的设置。/秒

有趣的是,stackoverflow 的答案有时会提供比官方文档更好的信息。
2021-05-22 23:48:44
你是一个美丽的人。此评论保存了我的项目
2021-05-25 23:48:44
感谢您的回答。有了这条线,我失去了一切(没有错误,没有显示任何内容)。我认为地图的高度还有另一个问题,因为我使用的是 css module。我明天去调查。
2021-05-30 23:48:44
@ThomasThiebaud 听起来不错,还想确保您的传单版本与我提供的链接相匹配,并设置地图组件/容器的高度。
2021-06-15 23:48:44
我知道了 !你不得不安装的高度.leaflet-container
2021-06-17 23:48:44

我也是使用这个库的新手,没有找到足够清晰的文档。但是,为了使此功能起作用,我认为有一些必要的事情。

1.react-传单包

2.传单包装:

或者,使用 npm 安装它

npm install leaflet
import 'leaflet/dist/leaflet.css';在您使用Mapfrom的文件中react-leaf

或者

将这两行包含在index.html

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
  integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
  crossorigin=""/>

<!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
  integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
  crossorigin=""></script>

3. 将此添加到 App.css 或 index.css 并导入文件:(这是必须的)

.leaflet-container {
  width: 100wh; 
  height: 100vh;
}

// 或直接向地图容器添加样式

<Map
   center={position}
   zoom={1}
   style={{ height: '100vh', width: '100wh' }}
   >
   <TileLayer .... />
</Map>

谢谢,只需要更正宽度 style={{ height: '100vh', width: '100wh' }}
2021-06-15 23:48:44

以防万一有人遇到同样的问题,我只需添加以下内容即可解决:

import 'leaflet/dist/leaflet.css';

试试这个

import React, { Component } from 'react'
import Leaflet from 'leaflet';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet'
import 'leaflet/dist/leaflet.css';

Leaflet.Icon.Default.imagePath =
'../node_modules/leaflet'

delete Leaflet.Icon.Default.prototype._getIconUrl;

Leaflet.Icon.Default.mergeOptions({
    iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
    iconUrl: require('leaflet/dist/images/marker-icon.png'),
    shadowUrl: require('leaflet/dist/images/marker-shadow.png')
});



export default class MapDisplay extends Component {
state = {
    lat: 41.257017,
    lng: 29.077524,
    zoom: 13,
}


render() {
    const position = [this.state.lat, this.state.lng]
    return (
    <Map center={position} zoom={this.state.zoom} style={{height : '400px'}}>
        <TileLayer
        attribution='&amp;copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
        <Marker position={position}>
        <Popup>
            Son Konum
        </Popup>
        </Marker>
    </Map>
    )
}
}
不...这解决了我的问题 --> Leaflet.Icon.Default.imagePath = '//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.4/images/';
2021-06-16 23:48:44
它有助于查看地图。但我看不到标记图标
2021-06-17 23:48:44

您可以通过在 index.html 的 head 元素内添加以下代码行来修复。

<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/7.0.0/normalize.min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css">

<style>
  body {
    padding-bottom: 30px;
  }
  h1, h2, p {
    font-family: sans-serif;
    text-align: center;
  }
  .leaflet-container {
    height: 400px;
    width: 80%;
    margin: 0 auto;
  }
</style>

注意:您可以更改 CSS 以满足您的需要。