首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将创建的React Leaflet层发布到API?

如何将创建的React Leaflet层发布到API?
EN

Stack Overflow用户
提问于 2021-09-14 11:50:27
回答 1查看 196关注 0票数 0

我想在react-leaflet中绘制一个多边形,并将创建的层发布到API。除此之外,还有不同的任务保存在数据状态中。当前活动的任务保留在activeTask中。data和activeTask都是由上下文提供的。每次我发布一个图层时,我都想添加当前活动任务的taskId。问题是:当我发布图层和taskId时,taskId是空的。因此,在第一个console.log (称为"activeTask 1")中,activeTask不为空,因此一切正常。但是在第二个console.log (称为"activeTask 2")中,activeTask是空的。如何访问activeTask并将其_id发布到接口?

代码语言:javascript
运行
复制
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='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
                url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
            />
            {listAreas}
        </MapContainer>
    )
}

export default LeafletComponent;
EN

回答 1

Stack Overflow用户

发布于 2021-09-14 15:08:31

您是否尝试将_onCreated实现为依赖于activeTask的useCallback。像这样

代码语言:javascript
运行
复制
const _onCreated = React.useCallback(async (e) => {
       //... 
}, [activeTask]);

React -> useCallback

您还可以考虑将for循环放入useMemo中

代码语言:javascript
运行
复制
const listAreas = React.useMemo(() => {
...
}, [data])

甚至可以使用像ramdajs这样的东西来简化嵌套循环,如下所示

代码语言:javascript
运行
复制
pipe(
  map(x => x.taskArea),  
  flatten,
  filter(x => x && x.areaBoundaries)
  map(x => (<GeoJSON key... />))
)(data)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69177235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档