React-leaflet 未捕获的类型错误:无法读取未定义的属性(读取“标记”)
我正在使用 react-leaflet,并且已经创建了一张地图,其中已经放置了标记。我只是想创建一个函数,当单击按钮时,添加一个新标记。但我收到此错误: Uncaught TypeError:无法读取未定义的属性(读取“marker”)
注意: filterGare1 部分​​和 gare 变量对应于从 JSON 文件中检索到的经度和纬度数据
这是我的代码:
import "./App.css";
import "leaflet/dist/leaflet.css";
import { MapContainer, TileLayer, Marker, Popup } from "react-leaflet";
import { iconPerso } from "./iconMarker";
import { map, L} from "leaflet";
import dataGares from "./data/referentiel-gares-voyageurs.json";
const center = [46.227638, 2.213749];
const filterGare1 = dataGares.filter(
(gare) => gare.fields.segmentdrg_libelle === "a"
);
function getLayers(){
var newMarker = new L.marker([42.5020902, 2.1131379])
.addTo(map)
.bindPopup("MARKER TEST");
}
export default function App() {
const [, updateState] = React.useState();
const forceUpdate = React.useCallback(() => updateState({}), []);
let niveau = filterGare1;
return (
<MapContainer
center={center}
zoom={6}
style={{ width: "100vw", height: "100vh" }}
>
<TileLayer
url="https://api.maptiler.com/maps/basic/256/{z}/{x}/{y}.png?key=F4ZxF5g8ioWE3GlTx3i0#-0.2/0.00000/76.51878"
attribution='<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>'
/>
{niveau.map((gare) => (
<Marker
key={gare.recordid}
position={[
gare.fields.latitude_entreeprincipale_wgs84,
gare.fields.longitude_entreeprincipale_wgs84,
]}
icon={iconPerso}
>
<Popup>
<h3> {"Name : " + gare.fields.gare_alias_libelle_noncontraint} </h3>
<button onClick={getLayers}>get Layers</button>
</Popup>
</Marker>
))}
<GetZoom />
</MapContainer>
);
}
我在网上搜索答案,但没有一个提出的解决方案可以解决我的问题。 有人谈论 markerCluster -> Leaflet 1.7:L.MarkerClusterGroup 不是函数 但这实际上与我想要做的事情不符。我只想在地图上添加一个标记,但我不知道我的错误可能出在哪里,有人能看出来吗?提前谢谢了
这可能是 L 的导入,这就是我能够使用 L 的方式
import L, { LeafletMouseEventHandlerFn } from "leaflet";
但是,您将 leaflet 和 react-leaflet 工作流程混合用于标记。我建议您只对所有标记使用 react-leaflet 标签。
只需在单击时将标记添加到状态,然后像对待其他标记一样呈现该状态
export default function App() {
const [, updateState] = React.useState();
const forceUpdate = React.useCallback(() => updateState({}), []);
const [markers, setMarkers] = React.useState([]);
let niveau = filterGare1;
return (
<MapContainer
center={center}
zoom={6}
style={{ width: "100vw", height: "100vh" }}
>
<TileLayer
url="https://api.maptiler.com/maps/basic/256/{z}/{x}/{y}.png?key=F4ZxF5g8ioWE3GlTx3i0#-0.2/0.00000/76.51878"
attribution='<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>'
/>
{niveau.map((gare) => (
<Marker
key={gare.recordid}
position={[
gare.fields.latitude_entreeprincipale_wgs84,
gare.fields.longitude_entreeprincipale_wgs84,
]}
icon={iconPerso}
>
<Popup>
<h3> {"Name : " + gare.fields.gare_alias_libelle_noncontraint} </h3>
<button onClick={() => setMarkers([[42.5020902, 2.1131379]])}>
get Layers
</button>
</Popup>
</Marker>
))}
{markers.map((marker, i) => (
<Marker key={`marker-${i}`} position={marker} />
))}
<GetZoom />
</MapContainer>
);
}
编辑:setMarkers 只是添加了位置,而不是数组中的位置。这应该导致
marker
只是一个数字而不是一个位置。我的示例更改为
setMarkers([[42.5020902, 2.1131379]]
。
您当然可以使用自己的对象作为数组中的项目,这只是为了显示最不需要的数据(位置)
尝试更改创建 function getLayers(){...> 的方式。
将其更改为 Lambda 或 Arrow 函数: getLayers = () => {...>