reactjs - GeoIPify 和 React-leaflet 无法获取纬度和经度
问题描述
刷新页面后加载页面时出现“错误:无效的 LatLng 对象:(未定义,未定义)”错误。当我第一次进入{[IPdata?.location?.lat, IPdata?.location?.lng]}
时,它呈现出来。但是我再次刷新后出现错误。如果我直接输入纬度和经度值而不是对象,则页面加载正常。其他数据也加载正常,除了IPdata?.location?.lat, IPdata?.location?.lng
. 如果我从页面中删除这两个值,一切正常。请在这里需要帮助!
指定时{[IPdata?.location?.lat, IPdata?.location?.lng]}
import React, { useEffect, useState } from "react";
import Result from "../src/Components/Result";
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet'
function App() {
const APP_KEY = "personalKey";
const [IPdata, SetIPData] = useState([]);
const [search, setSearch] = useState("");
const [query, setQuery] = useState("8.8.8.8");
const [loaded, setLoaded] = useState(false);
useEffect(() => {
getIp();
setLoaded(true);
}, [query]);
async function getIp() {
const response = await fetch(`https://geo.ipify.org/api/v1?apiKey=${APP_KEY}&ipAddress=${query}`);
const data = await response.json();
console.log(data);
SetIPData(data)
}
function handleChange(event) {
setSearch(event.target.value);
console.log(event.target.value);
}
function handleSubmit(event) {
event.preventDefault();
setQuery(search);
setSearch('');
}
return (
loaded ? (
<div>
<div className="container">
<div className="input-section">
<h1 className="header"> IP Address Tracker</h1>
<form onSubmit={handleSubmit} className="search-form">
<input className="search-input" type="text" placeholder="Search for any IP address or domain" onChange={handleChange} />
<button className="search-button" type="submit"> Go! </button>
</form>
</div>
<div className="result-container">
<Result
heading={"IP Address"}
searchResult={IPdata.ip}
/>
<Result
heading={"Location"}
searchResult={IPdata?.location?.country}
/>
<Result
heading={"Timezone"}
searchResult={"UTC" + IPdata?.location?.timezone}
/>
<Result
heading={"ISP"}
searchResult={IPdata.isp}
/>
</div>
</div>
<MapContainer center={[IPdata?.location?.lat, IPdata?.location?.lng]} zoom={13} scrollWheelZoom={true}>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={[IPdata?.location?.lat, IPdata?.location?.lng]}>
<Popup>
Your IP Location
</Popup>
</Marker>
</MapContainer>
</div> ) : <p>Loading...</p>
)
}
export default App;
解决方案
{IPdata.location && (
<MapContainer
center={[IPdata.location?.lat, IPdata.location?.lng]}
zoom={13}
scrollWheelZoom={true}
>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={[IPdata?.location?.lat, IPdata?.location?.lng]}>
<Popup>Your IP Location</Popup>
</Marker>
</MapContainer>
)}
推荐阅读
- python-3.x - 1. 从字符串中删除所有小写字母。输入="amiT123" 输出="T123"
- c# - SQL Server db 在不运行更新数据库的情况下更新项目构建(使用 EF6 和代码优先迁移)
- python-3.x - 使用 cv2 进行灰度图像旋转
- php - 如何将本地文件夹的多个文件上传到ftp文件夹?
- excel - 自动格式化提前结束
- c - 如何将 Python 字符串列表转换为 wchar_t 的 C 数组?
- python - 无法在评论删除页面显示帖子标题
- docker - Docker 中的 Kubernetes 集群是什么?
- r - 在 dplyr 管道中加入非 R 标准列名
- arrays - 在 ruby 中,如何用 id 键重新排列对象数组,将数组的新顺序作为数组给出?