无法在 React Leaflet Next.js 中加载标记
2020-08-29
1519
我无法在 next.js 中加载 react leaflet Marker。
在这里我调用了我的地图组件。
const MapSearch = dynamic(import('../../components/Map'), {
ssr: false,
loading: () => (
<div style={{textAlign: 'center', paddingTop: 20}}>
Chargement…
</div>
)
})
const Map = () => (
<MapSearch />
)
这是我的组件
import React, { useState } from 'react';
import L from 'leaflet';
import { Map, Marker, Popup, TileLayer } from 'react-leaflet';
const LeafletMap = () => {
const [coordinates, setCoordinates] = useState({
lat: 51.505,
lng: -0.09,
zoom: 13,
});
React.useEffect(() => {
const L = require("leaflet");
delete L.Icon.Default.prototype._getIconUrl;
L.Icon.Default.mergeOptions({
iconUrl: require('leaflet/dist/images/marker-icon.png'),
shadowUrl: require('leaflet/dist/images/marker-shadow.png')
});
}, []);
const position = [coordinates.lat, coordinates.lng];
return (
<Map center={position} zoom={coordinates.zoom} style={{ width: '100%', height: '600px' }}>
<TileLayer
attribution="© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors"
url="http://{s}.tile.osm.org/{z}/{x}/{y}.png"
/>
<Marker position={position}>
<Popup>
<span>
Marker 1 <br /> Easily customizable.
</span>
</Popup>
</Marker>
</Map>
);
};
export default LeafletMap;
我收到错误,您需要添加加载器来处理 png 文件。因此,从谷歌搜索中,我添加了 next.config.js 并添加了以下代码
module.exports = {
webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
config.module.rules.push({
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve("url-loader")
});
return config;
}
};
现在当我加载页面时,地图正在加载,但标记未加载。当我检查标记 img src 时,它正在作为对象模块。
我也尝试删除 L.Icon.Default.mergeOptions 行,但在这种情况下,我收到错误 http://localhost:3000/_next/static/media/marker-icon.1e8408af1a34bdf614570719b0d6e5ce.png%22)marker-icon.png 404 (未找到)。
我是 Next.js 的新手。
1个回答
我可能有一个解决方案给你
我遇到了和你同样的问题,这个对我有用:
我使用了这个库: https://github.com/ghybs/leaflet-defaulticon-compatibility
首先运行以下命令:
npm install leaflet-defaulticon-compatibility --save
然后在您尝试实现地图的文件上(对我来说它是 Map.js)只需添加以下导入:
import { MapContainer, Marker, Popup, TileLayer } from 'react-leaflet';
import 'leaflet/dist/leaflet.css';
import 'leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.webpack.css'; // Re-uses images from ~leaflet package
import 'leaflet-defaulticon-compatibility';
重新加载页面,您应该看到应有的标记。
Hooppitt
2021-06-24