react使用leaflet的项目总结和优化

注意:我这里是当下不超过600个标记点,所以我这里是一次性渲染出来进行优化的,如果数据大于2000条甚至更大的时候,需要用其他的优化方法,而不是这样一次性全部渲染出来这些所有标记点的数据。

需求: 在首页的地图内,增加一个一个的marker来进行展示echarts,效果如下图,地图用的是leaflet,图表用的是echarts
在这里插入图片描述

在开发中,我遇到两个比较大的问题

第一个:

图表一直加载的问题,因为当我点击不同的图表时会显示不同的图表详情,那我地图上的所有图表都再次进行循环渲染,然后实现页面完整的展示,可这样做,用户等待的时间过久,体验优化做的不好,所以我这里在组件内使用了useMemo来实现了标签只执行一次的设置,然后监听用户搜索后数据的更改后再进行重新的页面渲染。
代码仅供展示:

<Card className={style.home_mapCom}>
    <MapContainer
      crs={CRS_4490}
      zoomSnap={0.1}
      center={posiPoint}
      zoom={zoomData}
      layers={[TiledMapLayer]}
      scrollWheelZoom={true}
      style={{ heihgt: 'auto', backgroundColor: '#fff' }}
    >
      {useMemo(
        () => (
          <>
            {mapData.length > 0 &&
              mapData.map((item) => {
                return (
                  <>
                    <Marker
                      key={item.companyId}
                      position={item.point}
                      icon={LeafIcon3(item)}
                      eventHandlers={{
                        click: () => MarkerEventClick(item),
                      }}
                    />
                  </>
                );
              })}
          </>
        ),
        [mapData],
      )}
      <MyComponent />
      <MarkPosition showView={markShow} />
    </MapContainer>
    {/* 详情展示部分 */}
    {isEndShow()}
</Card>

第二个:

但是这样做还会有一次问题 页面的图表渲染是根据js获取标签id来进行渲染的,当我useMemo获取到数据进行渲染了,而我的图表已经开始渲染了,这样会造成页面并未展示出来我的图表,仅是展示出来我的标签。那这里我用useEffect来解决的

 // 顺序 1
  useEffect(() => {
    setPosiPoint([...position]);
    setZoomData(props.zoom);
    setClose('none');
  }, []);
  // 顺序 2
  useEffect(() => {
    setMapData(mapList || []);
    if (mapList && mapList.length) {
      setZoomData(props.zoom);
      setMapData(mapList || []);
    } else {
      setZoomData(10.5);
      setMapData([]);
    }
  }, [posiPoint, mapList]);
  // 顺序 3 —— 这里主要是用来监听mapData获取了新的数据后,重新渲染echarts图的
  useEffect(() => {
    getEchartsOption();
    if (JSON.stringify(mapList) === '[]') {
      setClose('noEnd');
    } else if (mapData && mapData.length > 0) {
      setClose('none');
    }
    setMarkShow(false);
    setZoomData(10.5);
  }, [mapList, mapData]);

总结:这里的优化告诉我,使用哪个框架就要把那个框架内的api和官网了解清楚,这也是为了我们更好地在做项目中针对组件做优化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Leaflet是一个用于在React应用程序中集成Leaflet地图库的库。它允许您使用React组件的方式来创建和管理Leaflet地图。您可以使用React Leaflet来在React应用程序中绘制和操作Leaflet地图,并利用Leaflet提供的丰富功能和插件。您可以通过克隆Lantmäteriet的React Leaflet地图仓库、安装依赖并启动应用程序来了解更多关于React Leaflet的用法和示例。 另外,如果您想在React中绘制地图,您需要直接使用Leaflet库而不是Vue-Leaflet插件。您可以访问Leaflet官网了解更多关于Leaflet的用法和文档。 在React Leaflet中,您可以创建内容组件来显示地图元素的属性信息。例如,您可以创建一个名为SimplePropertiesPopup的组件,该组件将一个对象的key-value转换为一个无序列表(ul-li)的形式展示。您可以在该组件中使用map函数来遍历对象的属性,并将其渲染为列表项。通过导入该组件并在需要展示属性的地图元素上使用,您可以在React Leaflet中展示简单的要素属性列表。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [lantmateriet-leaflet-react:具有来自Lantmäteriet的图片的React Leaflet地图示例](https://download.csdn.net/download/weixin_42109732/18666610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [leaflet地图在React中的使用](https://blog.csdn.net/Joey_Tribiani/article/details/124326145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [ReactLeaflet 环境安装与基本使用](https://blog.csdn.net/cyoubo/article/details/118156333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值