我想在react-leaflet中绘制一个多边形,并将创建的层发布到API。除此之外,还有不同的任务保存在数据状态中。当前活动的任务保留在activeTask中。data和activeTask都是由上下文提供的。每次我发布一个图层时,我都想添加当前活动任务的taskId。问题是:当我发布图层和taskId时,taskId是空的。因此,在第一个console.log (称为"activeTask 1")中,activeTask不为空,因此一切正常。但是在第二个console.log (称为"activeTask 2")中,activeTask是空的。如何访问activeTask并将其_id发布到接口?
import React, { useContext } from 'react';
import axios from 'axios';
import { MapContainer, TileLayer, Marker, Popup, FeatureGroup, GeoJSON } from 'react-leaflet';
import { EditControl } from 'react-leaflet-draw';
import 'leaflet/dist/leaflet.css';
import 'leaflet-draw/dist/leaflet.draw.css';
import { DataContext } from './DataContext';
const LeafletComponent = () => {
const { dataContext, activeTaskContext } = useContext(DataContext);
const [activeTask, setActiveTask] = activeTaskContext;
const [data, setData] = dataContext;
const position = [51.505, -0.09]
let listAreas = [];
for (let i = 0; i < data.length; i++) {
if ("taskArea" in data[i]) {
for (let j = 0; j < data[i].taskArea.length; j++) {
if ("areaBoundaries" in data[i].taskArea[j]) {
listAreas.push(<GeoJSON key={data[i].taskArea[j]._id} data={JSON.parse(data[i].taskArea[j].areaBoundaries)} />);
}
}
}
}
console.log("activeTask 1");
console.log(activeTask);
const _onCreated = async (e) => {
console.log("activeTask 2");
console.log(activeTask);// <-- this activeTask is empty
const layer = e.layer;
const geoj = layer.toGeoJSON();
const postData = {
taskId: activeTask._id,// <-- this activeTask is empty
areaBoundaries: JSON.stringify(geoj)
}
try {
const response = await axios.post('http://localhost:3333/createarea', postData);
// do something with response
} catch (error) {
console.log(error);
}
};
return (
<MapContainer center={position} zoom={13} scrollWheelZoom={true}>
<FeatureGroup>
<EditControl position="topright" onCreated={_onCreated} draw={{
marker: false,
circle: false,
circlemarker: false,
rectangle: true,
polyline: false,
polygon: true
}} />
</FeatureGroup>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
{listAreas}
</MapContainer>
)
}
export default LeafletComponent;
发布于 2021-09-14 15:08:31
您是否尝试将_onCreated实现为依赖于activeTask的useCallback。像这样
const _onCreated = React.useCallback(async (e) => {
//...
}, [activeTask]);
您还可以考虑将for循环放入useMemo中
const listAreas = React.useMemo(() => {
...
}, [data])
甚至可以使用像ramdajs这样的东西来简化嵌套循环,如下所示
pipe(
map(x => x.taskArea),
flatten,
filter(x => x && x.areaBoundaries)
map(x => (<GeoJSON key... />))
)(data)
https://stackoverflow.com/questions/69177235
复制相似问题