react中Modal组件与openlayers地图实例化在feature要素绘制与清除等场景中存在的bug

news2025/5/26 4:20:50

在有地图的实际业务中会有一个经常的场景,那就是地图的初始化,一般如下:

 useEffect(() => {
    initMap();
  }, [visible]);

我们经常利用Modal组件中open属性状态true与false来作为监听地图初始化的条件。

      <Modal
        title={<div className="title">新增设备</div>}
        width={1120}
        className="argicul-modal"
        footer={null}
        centered
        closable={true}
        onCancel={onCancel}
        open={visible}>
        ......
     </Modal>

对于一般的业务处理来说,通过监听一个状态决定地图的实例化是没问题的。

bug问题:

如果需要在Modal组件上这个地图上点线面要素的添加删除、点线面要素的绘制交互与清除等操作时,会出现一个bug:就是每次关闭Modal组件后再打开,会发现再进行添加或删除要素失效,清除再一次绘制完的要素也会失效。
1.如:第一次打开Modal时,添加与删除这个点要素,正常实现。当关闭组件再次打开操作时,发现删除无效,添加点要素后位置也没更新。在这里插入图片描述

bug原因:

一般我们可能首先回去寻找要素绘制与删除的逻辑是否存在问题,花费大量时间发现没错。
出现这个bug最主要的原因就是每一次监听map实例化的条件变一次,map就会再实例化一次,简而言之就是每次关闭再打开的这个操作会导致map多次实例化,Modal组件上会渲染多层map地图,我们第一次对要素的各种操作其实是在第一个实例化的map上,也就是视图上最底下那层。因此,我们对于要素的各种操作实际上生效了,只是被后面实例化的map图层掩盖了,因而表现出失效的假象。

bug解决方法:

既然我们弄清楚了是map实例化多次导致的,那么接下来就是想办法让**map在一开始只实例化一次。**所以需要一个在此页面展示时只变化一次的一个状态值。一般点击到Modal组件的父组件这各页面时,找到此时让map实例化一次的条件。
一般两种情况:
1.Modal组件的父组件的props传值参数中是否有唯一变化的 “标识” ,比如有多个tabs组件,Modal就在其中一个tabs组件中,看看每个tabs组件从其父组件上传过来的props中是否有区别tabs的 “标识”。(如果实在没有再看看父组件中有办法传一个“标识”给子组件的props不)
比如说此时我有如下tabs组件,其中每个tab的props中有个属性不同:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么监听的条件找到了,拿到这个值,监听这个值,在这里还会有一个bug,如果直接监听这个值,会出现以下bug:
Too many re-renders. React limits the number of renders to prevent an infinite loop.
原因在这篇博客中:https://blog.csdn.net/fish_skyyyy/article/details/119137987
解决办法:在Modal打开的点击事件中进行值的判断与状态的设置,然后在地图上监听。

 const [mapvisible, setmapvisible] = useState(false);
 //打开Modal页面的按钮事件
 const addDevice = () => {
    setVisible(true);
    if(props.title.props.children=='农情设备'){
      setmapvisible(true)
     }
  };
   useEffect(() => {
    initMap();
  }, [mapvisible]);

2.一般在“链式组件”的使用场景中(点击组件A弹出B,点击B弹出C)
比如在B组件中:

const SelectDialog = forwardRef((props, ref) => {
    const [selectedItem, setSelectedItem] = useState("rtk");
    const [visible, setVisible] = useState(false);
    const [mapvisible, setmapvisible] = useState(false);
    const rtkLandRef = useRef<any>(null);
    //使用useImperativeHandle进行上下传递方法
    useImperativeHandle(ref, () => ({
        setVisible,
        setmapvisible
    }));
    const selectItem = () => {
        setVisible(false);
        if (selectedItem == "rtk") {
            //组件C(RTKLand)可以使用这两个方法,且B组件的状态值也可带入
            rtkLandRef.current?.setVisible(true);
            rtkLandRef.current?.setmapvisible(true);
        } 
    }
    const select = (type: string) => {
        setSelectedItem(type);
    }

return (
        <div>
            <Modal open={visible} width={680} closable={false} onCancel={onCancel} centered forceRender={true} footer={false} bodyStyle={{ textAlign: "center", padding: 48 }}>
                <div className={`Land-item  ${selectedItem == 'rtk' ? 'Land-item-selected' : ''}`} onClick={() => { select('rtk') }}>打点仪数据录入</div>      
            </Modal>
            <RTKLand ref={rtkLandRef}></RTKLand>
        </div>
    )
}

这样C组件(RTKLand)就可以拿到mapvisible的状态值进行map实例化监听,点击B组件时才会改变一次mapvisible的状态值,在C组件中再无论打开还是关闭C组件中的Modal组件就不会多次渲染map了。

const RTKLand = forwardRef((props, ref) => {
  const [visible, setVisible] = useState(false);
  const [mapvisible, setmapvisible] = useState(false);
  useImperativeHandle(ref, () => ({
    setVisible,
    setmapvisible
  }));
    useEffect(() => {
    initMap();
  }, [mapvisible]);
return (
    <Modal
      title={<div className="rtk-title">{title}</div>}
      open={visible}
      width={1120}
      onCancel={onCancel}
      footer={null}
      centered>
      ......
  </Modal>
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python导入模块,Python import用法

使用 Python 进行编程时&#xff0c;有些功能没必须自己实现&#xff0c;可以借助 Python 现有的标准库或者其他人提供的第三方库。比如说&#xff0c;在前面章节中&#xff0c;我们使用了一些数学函数&#xff0c;例如余弦函数 cos()、绝对值函数 fabs() 等&#xff0c;它们位…

git修改历史提交(commit)信息

我们在开发中使用git经常会遇到想要修改之前commit的提交信息&#xff0c;这里记录下怎么使用git修改之前已经提交的信息。一、修改最近一次commit的信息 首先通过git log查看commit信息。 我这里一共有6次commit记录。 最新的commit信息为“Merge branch ‘master’ of https:…

在线研讨会邀请 | 赋能“大”研发,助力“快”交付

在全速前进的后疫情时代&#xff0c;公司业务飞速发展&#xff0c;您&#xff0c;准备好了吗—— 您的开发、设计、美术等团队可能分布在全球各地&#xff0c;您如何帮助他们实现跨部门、跨区域的协作——让他们便捷共享、审查各种大文件&#xff08;包括二进制文件&#xff0…

【GD32F427开发板试用】+ GDLink和USART2

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;夏漳 一 GDLink下载和调试 1.1 硬件结构和试用板组成 感谢极术社区提供的GD32开发板&#xff0c;具体的板子资源和配套软件可以在极术社区官…

09笔记 IO操作

目录 一.向一个文本文件中写入数据&#xff1a; 二.从一个文本文件中读取数据&#xff0c;并对读取的数据做简单处理。 三.二进制文件的写入操作 四.对二进制文件的读取操作 五. 举例 六.IO操作的简单应用&#xff08;代码和举例都在更新和完善中&#xff09; 一.向一个文本…

软件测试工程师成神之路2023整理版

版本 更新日期 审核 备注 V0.3 2020-06-01 三丰 增加3大自动化 V1.0 2021-10-01 Nick 添加持续集成 V2.0 2023-01-31 三丰 完整性能版本 我看到迄今为止最完整的软件测试技术路线梳理 Python 编程语言 自动化之Python 编程语言 编程语言介绍/编程概念讲解/环…

大数据技术架构(组件)29——Spark:Memory Model(2)

2.1.8.5、Memory addressing以上小节介绍了spark对堆的划分&#xff0c;根据使用目的不同&#xff0c;对堆进行了区域划分,并说明了spark1.6之前和之后使用的两种不同内存模型管理以及之间的区别&#xff0c;那么这里继续逐步分析&#xff0c;说到内存管理&#xff0c;spark是如…

CTFshow菜狗杯-misc-wp(详解 脚本 过程 全)

首先感谢ctf平台和各位出题的大佬其次感谢各位读者&#xff0c;对我的支持( •̀ ω •́ )y 有什么问题和建议可以私聊我废话不多话开启你们的旅程吧 这个也是我这几天才看 一些见解和思路分享给你们希望你们在旅途中玩的开心&#xff0c;学的开心✌( •̀ ω •́ )y杂项签到…

opencv+python物体检测【03-模仿学习】

仿照练习&#xff1a;原文链接 步骤一&#xff1a;准备图片 正样本集&#xff1a;正样本集为包含“识别物体”的灰度图&#xff0c;一般大于等于2000张&#xff0c;尺寸不能太大&#xff0c;尺寸太大会导致训练时间过长。 负样本集&#xff1a;负样本集为不含“识别物体”的…

无公网IP环境快解析实现医美ERP外网访问

现阶段&#xff0c;借助医学手段让人们变美逐渐成为时尚&#xff0c;医美走进公众生活的步伐也在不停加快&#xff0c;整个医美行业总体处于蓬勃发展之势&#xff0c;因此医美行业ERP需求量也不断增加。医美管理软件系统涵盖HIS、进销存、CRM、CallCenter、经营报表等模块&…

【王道数据结构】第七章| 查找 | 树

目录 一、查找 1、查找概念 2、顺序查找 3、折半查找 4、分块查找 二、树 1、B树 2、B树的基本操作 3、B树 4、散列查找及其性能分析 5、散列查找及性能分析 一、查找 1、查找概念 查找&#xff1a;在数据集合中寻找满足某种条件的数据元素的过程称为查找。查找…

当ChatGPT遇到前端开发

目录 一、ChatGPT是什么&#xff1f; 二、怎么注册使用ChatGPT&#xff1f; 1、注册账号 2.完成 ChatGPT 手机号码验证 3、登录 ChatGPT 账号并开始使用 三、当ChatGPT遇到前端开发 四、深思总结 AIGC 作画带给人们的惊艳感觉还未散去&#xff0c;ChatGPT 又来刺激人类脆…

leetcode 困难 —— N 皇后, N皇后 II,八皇后(简单递归)

&#xff08;不知道为啥总是给这种简单的递归设为困难题&#xff0c;虽然优化部分很不错&#xff0c;但是题目太好过了&#xff09; 题目&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个…

java 自定义json解析注解 复杂json解析 工具类

java 自定义json解析注解 复杂json解析 工具类 目录java 自定义json解析注解 复杂json解析 工具类1.背景2、需求-各式各样的json一、一星难度json【json对象中不分层】二、二星难度json【json对象中出现层级】三、三星难度json【json对象中存在数组】四、四星难度json【json对象…

【Selenium学习】Selenium 八大定位法

1.1 ID定位HTML Tag 的 id 属性值是唯一的&#xff0c;故不存在根据 id 定位多个元素的情况。下面以在百度首页搜索框输入文本“python”为例。搜索框的 id 属性值为“kw”&#xff0c;如图1.1所示&#xff1a;代码如下&#xff0c;“find_element_by_id”方法已废弃&#xff0…

基于nodejs+vue的健身房课程预约平台

本系统主要实现了首页、个人中心、用户管理、教练管理、会员卡管理、购买会员管理、课程类型管理、课程信息管理、课程购买管理、场地信息管理、场地预约管理、系统管理,用户&#xff1a;首页、个人中心、购买会员管理、课程购买管理、场地预约管理,教练&#xff1a;首页、个人…

睿创转债,声迅转债上市价格预测

睿创转债基本信息转债名称&#xff1a;睿创转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;15.6469亿元。正股名称&#xff1a;睿创微纳&#xff0c;今日收盘价&#xff1a;47.45元&#xff0c;转股价格&#xff1a;40.09元。当前转股价值 转债面值 / 转…

树生成工具泛型接口 TreeNode

1、定义泛型接口 // 实现接口需要传入两个参数&#xff0c;第一个T 为节点中的id&#xff0c;第二个R 为节点&#xff0c;TreeNode。 public interface TreeNode<T, R extends TreeNode<T, R>> {/*** 获取节点id** return 树节点id*/T id();/*** 获取该节点的父节…

读书笔记//《数据分析:企业的贤内助》

数据分析师是个杂家——作者陈哲。 为什么写这本书&#xff1f; 懂得再多知识却不会用&#xff0c;原因是缺少通往思路、方法和技能的两条路径——项目流程和项目应用&#xff08;案例&#xff09; —————————— 数据分析师的晋升空间 &#xff08;见第2章&#xff0…

NLP模型检查英语语法错误

当NLP模型产生了语法错误&#xff0c;怎么办&#xff1f;比如&#xff0c;He wants that you send him an email.没关系&#xff0c;现在可以像小时候的英语老师&#xff0c;改作文一样简单。只要装上一个专门纠正语法错误的库就可以&#xff0c;还是毫秒钟就可揪出来的那种。这…