javascript - React LeafletJs Map 即使在状态更改时也不会重新渲染?
问题描述
因此,我正在创建一个 IP 地址跟踪器,其中我使用 API 来使用 IP 获取坐标,然后将这些坐标更新为相应的状态,但即使在更新状态时,地图也不会使用新坐标重新渲染,即使标记切换到新位置,但地图保持原样。我在互联网上搜索了对代码进行了多次编辑,但仍然没有发现任何问题,请帮助我。
import React, { useEffect, useState } from 'react';
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';
import './styles/app.scss';
function App() {
const [ip, setIP] = useState('132.154.30.217');
const [data, setData] = useState({});
const [load, setLoad] = useState(false);
const [lng, setLng] = useState(-78.90869903564453);
const [lat, setLat] = useState(35.056339263916016);
function getData(event) {
event.preventDefault();
setLoad(true);
fetch(`http://api.ipstack.com/${ip}?access_key=${process.env.REACT_APP_IPSTACK_ACCESS_TOKEN}`)
.then(response => response.json())
.then(data => {
setData(data);
setLat(data.latitude);
setLng(data.longitude);
});
setLoad(false);
}
useEffect(() => {
}, [data])
return (
<div className="app-container">
<div className="upper-container">
<h2 className='text-center text-white pt-5'>IP ADDRESS TRACKER</h2>
<div className='search-bar mt-5'>
<form onSubmit={getData} className='d-flex justify-content-center h-100 align-items-center'>
<div>
<input type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" onChange={event => setIP(event.target.value)} />
</div>
<button type="submit" class="btn btn-dark">{load ? <div class="spinner-border text-light" role="status">
<span class="visually-hidden">Loading...</span>
</div> : 'GO'}</button>
</form>
</div>
</div>
<div className='middle-container'>
<div className='row data-slide shadow'>
<div className='col'>{data.city}</div>
<div className='col'>hhj</div>
<div className='col'>kj</div>
<div className='col'>kjhhj</div>
</div>
</div>
<div className="lower-container bg-info">
<MapContainer center={[lat, lng ]} zoom={18} scrollWheelZoom={true} className='map-container'>
<TileLayer
attribution='Map data © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>'
url="https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}"
id='mapbox/streets-v11'
accessToken={process.env.REACT_APP_MAPBOX_ACCESS_TOKEN}
/>
<Marker position={[lat, lng]}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</MapContainer>
</div>
</div>
);
}
export default App;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
谢谢你的相同:)
解决方案
推荐阅读
- android - 无法读写parcelable中的double列表
- javascript - 如何在图片上传中更改 XmlHttpRequest url
- javascript - 我的 javascript 没有执行
- javascript - 从 JavaScript 中的 JSON 数据创建饼图
- java - 如何使用@Step Annotation 在 Allure Report 中打印长字符串?
- python - 在 python 3 中重用 zip 迭代器
- xml - 如何在 databricks.xml scala 中保存 XML 数据
- scala - 失败时优雅地重启 Reactive-Kafka Consumer Stream
- select - 如何在 Grails 中自定义选择标签
- powershell - gsutil - cp 不处理管道中的每个项目