#twitter-bootstrap #reactjs #leaflet #react-bootstrap #react-leaflet
#twitter-bootstrap #reactjs #листовка #react-bootstrap #react-листовка
Вопрос:
react-leaflet
Карта не отображается должным образом.
- Карта отображается за пределами родительских границ
- Некоторые фрагменты карты отсутствуют
Проблема возникает при использовании карты со стандартными react
компонентами.
Мой сайт также использует react-bootstrap
. Как я прочитал, это может вызвать некоторые потенциальные проблемы с тем, как react-leaflet
выполняется рендеринг.
import React from 'react';
import ReactDOM from 'react-dom';
import { Map, Marker, Popup, TileLayer } from 'react-leaflet';
const position = [37.335556, -122.009167];
class MapView extends React.Component {
render() {
return (
<div
style={{
height:"100%"
}}>
<Map center={position} zoom={13}>
<TileLayer
url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
attribution='amp;copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
/>
<Marker position={position}>
<Popup>
<span>A pretty CSS3 popup.<br/>Easily customizable.</span>
</Popup>
</Marker>
</Map>
</div>
);
}
}
module.exports = MapView;
Ответ №1:
сначала вообще установите через консоль:
> npm install leaflet
> npm install react-leaflet
в index.js импортируйте css, который находится в node_modules
//src/index.js
import 'leaflet/dist/leaflet.css'
итак, теперь просто укажите поле и высоту:
////src/App.js
return (
<MapContainer center={position} zoom={3} scrollWheelZoom={false}
style={{ height:"`enter code here`400px",backgroundColor:"red",marginTop:"80px", marginBottom:'90px'
}} >
</MapContainer>
)
или
return (
<>
<Map style={{ width: "100%", height: "100vh" }} center={center} zoom={13}>
</Map>
</> )
Комментарии:
1. Это на несколько световых лет лучше, чем документация leaflet. Спасибо.
Ответ №2:
Также добавьте CSS и JS-файлы этих листовок в свой проект
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.2.0/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.2.0/dist/leaflet.js"></script>
Также добавьте высоту к карте. это обязательно.
Простой JsFiddle P.S. посмотрите на внешние ресурсы.
Ответ №3:
Основная проблема заключалась в том, что CSS не импортировался, а высота для компонента Map не была установлена.
Затем я исправил проблему с отсутствующим изображением маркера, используя react-leaflet-marker-layer
import React from 'react';
import ReactDOM from 'react-dom';
import { Map, Marker, Popup, TileLayer } from 'react-leaflet';
import MarkerLayer from 'react-leaflet-marker-layer';
const position = { lng: -122.673447, lat: 45.522558 };
const markers = [
{
position: { lng: -122.67344700000, lat: 45.522558100000 },
text: 'Voodoo Doughnut',
},
{
position: { lng: -122.67814460000, lat: 45.5225512000000 },
text: 'Bailey's Taproom',
},
{
position: { lng: -122.67535700000002, lat: 45.5192743000000 },
text: 'Barista'
},
{
position: { lng: -122.65596570000001, lat: 45.5199148000001 },
text: 'Base Camp Brewing'
}
];
class ExampleMarkerComponent extends React.Component {
render() {
const style = {
border: 'solid 1px lightblue',
backgroundColor: '#333333',
borderRadius: '50%',
marginTop: '-5px',
marginLeft: '-5px',
width: '10px',
height: '10px'
};
return (
<div style={Object.assign({}, this.props.style, style)}></div>
);
}
}
class MapView extends React.Component {
render() {
return (
<div
style={{
height:"700px"
}}>
<Map center={position} zoom={13}
style={{
height:"700px"
}}>
<TileLayer
url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
attribution='amp;copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
/>
<MarkerLayer
markers={markers}
longitudeExtractor={m => m.position.lng}
latitudeExtractor={m => m.position.lat}
markerComponent={ExampleMarkerComponent} />
</Map>
</div>
);
}
}
module.exports = MapView;
Ответ №4:
Может быть, вы можете попробовать это, это для React.js или Next.js , прямо сейчас он работает над react.js 18.
Сначала я рекомендую удалить любую библиотеку листовок, а затем установить эту
npm i leaflet leaflet-defaulticon-compatibility leaflet-geosearch
Вы можете использовать этот код:
import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react'
const markerRef = useRef(null)
const eventHandlers = useMemo(
() => ({
dragend() {
const marker = markerRef.current
if (marker != null) {
// setPosition(marker.getLatLng())
console.log(marker.getLatLng())
}
},
}),
[],
)
useEffect(() => {
// you will get the current position of the marker here
console.log(markerRef.current)
}, [markerRef.current])
//////////////////////
/// in the html
<MapContainer center={[40.8054, -74.0241]} zoom={14} scrollWheelZoom={false} style={{ height: "400px", width: "100%" }}>
<TileLayer
attribution='amp;copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
<Marker
eventHandlers={eventHandlers}
position={[40.8054, -74.0241]}
draggable={true}
animate={true}
ref={markerRef}
>
<Popup>
Hey ! you found me
</Popup>
</Marker>
</MapContainer>
Скопировано отсюда