从零实现一套低代码(保姆级教程)【运行时】 --- 【30】实现组件的删除和复制功能

摘要

本篇主要来实现一下,在设计器里,对组件进行删除和复制的功能。这一篇不该在运行时的分组里面,但是写到这里来,就继续写下去吧。

因为在设计页面的时候,一定会出现拖拽错组件的情况。所以我们给设计器增加删除组件的功能,同时对于已经配置好的组件,如果想再配置出一个,不如直接复制来的爽快,所以我们再给组件加一个复制的功能。

至于这两个功能按钮,我们只需要一直在组件的正上方即可。

所以在
XinBuilder2/src/pages/builder/mainPart/index.tsx
修改我们的getComponent方法

  const getComponent = (com: any) => {const Com = components[com.comType as keyof typeof components];return <div><div onDrop={onDropContainer(com)} key={com.comId} onClick={selectCom(com)}><div draggable onDragStart={onDragStart(com)} style={com.style}>{selectId === com.comId && <div className='buttonList'><CopyOutlined onClick={copyCom} /><DeleteOutlined onClick={deleteCom}/></div>}<div className={com.comId === selectId ? 'selectCom' : ''}><Com {...com} >{com.childList && com.childList.map((item: any) => {return getComponent(item)})}</Com></div></div></div></div>}

只有选中某个组件的时候,组件的正上方会出现这两个按钮。
在方法里添加了这一段DOM结构。

{selectId === com.comId && <div className='buttonList'><CopyOutlined onClick={copyCom} /><DeleteOutlined onClick={deleteCom}/></div>}

在这里插入图片描述

1.实现组件删除的方法

现在我们实现deleteCom方法,因为我们有selectId知道当前选中的组件ID。所以我们只需要在comList中,将对应ID的组件删除掉,然后更新redux的comList即可。

  const deleteCom = () => {const list = comList.filter((item:ComJson) => {return item.comId !== selectId;})Store.dispatch({type: 'changeComList', value: list})message.success('删除成功');}

删除完之后再来一条提示即可。

2.实现组件复制的功能

删除的逻辑很简单,现在我们再实现一下复制组件的功能。由于我们要保存复制节点的组件信息,所以这里我们要使用state进行状态管理。同时复制的时候更新state。

  	const [copyNode, setCopyNode] = useState<ComJson>();const copyCom = () => {const copyNode = comList.find((item: ComJson) => {return item.comId === selectId;})setCopyNode(copyNode);message.success('复制成功,ctrl + v 或者 command + v 进行复制');}

但当我保存了复制组件的信息后,如何粘贴呢。我们希望的效果是,当我通过Ctrl + V 或者Command + V 后,在鼠标位置复制出来一个一模一样的组件。

所以我们需要监听鼠标的位置,并且再监听键盘的keydown事件,当满足条件后,我们在comList里添加copyNode,并且更新redux即可。

  let currentMousePosition = { x: 0, y: 0 };useEffect(() => {const copyFun = (e: any) => {const comList = JSON.parse(JSON.stringify(Store.getState().comList))if((e.ctrlKey || e.metaKey) && e.key === 'v') {const style = {position: 'absolute',left: currentMousePosition.x + 'px',top: currentMousePosition.y + 'px',zIndex:100}let comId = `comId_${Date.now()}`;const newNode = {...copyNode, comId, style};comList.push(newNode);Store.dispatch({type: 'changeComList', value: comList});setSelectId(comId);}}const mouseMove = (e: any) => {currentMousePosition.x = e.clientX;  currentMousePosition.y = e.clientY; }document.addEventListener('mousemove', mouseMove);document.addEventListener('keydown', copyFun);return () => {document.removeEventListener('mousemove', mouseMove);document.removeEventListener('keydown', copyFun);}}, [copyNode])

在useEffect里,记得组件销毁的时候把绑定的事件销毁。直接return里进行document.removeEventListener操作。

这样,我们就完成了组件的复制和删除功能。

这部分代码提交在github上
https://github.com/TeacherXin/XinBuilder
commit: fix: 第二十五节:实现组件的删除和复制功能

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

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

相关文章

MES系统如何支持多品种小批量生产

MES系统&#xff08;制造执行系统&#xff09;在多品种小批量生产环境中发挥着至关重要的作用。它通过一系列先进的技术手段&#xff0c;提高了生产线的灵活性和效率&#xff0c;从而有效地支持了多品种小批量生产。以下是MES系统如何支持多品种小批量生产的详细分析&#xff1…

LVS FILTER UNUSED OPTION

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 过滤一些版图与spice网表对不上的器件。 一般后端遇不到这个问题,因为通常是需要写到网表中的decap没有写出来造成的,如下图。

MYSQL双主双从,使用Keepalived双机热备+LVS高可用群集

MYSQL双主双从&#xff0c;使用Keepalived双机热备LVS高可用群集 ​ 文档只记录KeepalivedLVSmysql主从&#xff0c;不包含检验&#xff0c;如需检验&#xff0c;请自行添加web服务器 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132maste…

【Matlab 路径优化】基于蚁群算法的XX市旅游景点线路优化系统

基于蚁群算法的XX市旅游景点线路优化系统 &#xff08;一&#xff09;客户需求&#xff1a; ①考虑旅游景点的空间分布、游客偏好等因素&#xff0c;实现了旅游线路的智能规划 ②游客选择一景点出发经过所要游览的所有景点只一次&#xff0c;最后回到出发点的前提下&#xf…

VS2019+QT VS tools:Debug下ok,relese下报错

报错界面 踩得坑&#xff1a; 尝试一下重装 QT VS tools&#xff0c;结果装不上。 尝试卸载原来的QT VS tools&#xff1a;卸载方法&#xff0c;到下面文件夹下可以看到有两个文件夹&#xff0c;分别是两个插件&#xff0c;找到QT的插件&#xff0c;删除文件夹即可。但是删除…

vscode 历史便携版下载方法

VScode安装版 https://update.code.visualstudio.com/版本号/win32-x64-archive/stable https://update.code.visualstudio.com/1.85.2/win32-x64-archive/stablevscode 便携版 vscode 历史版本地址 https://code.visualstudio.com/updates/v1_75#_remote-developmentexe 信…

Centos openssh CVE-2024-6378 漏洞升级

Openssh CVE-2024-6378 漏洞需要升级openssh版本,此次漏洞影响范围>=8.5P1,<9.8P1,当前官方最新版本就是9.8P1,所以必须升级到最新版本 升级方式 由于影响的设备范围很广,如果每台机器手工编译,很浪费时间,所以采取编译RPM包,然后使用RPM包升级的方式来升级 下载…

SQL索引事务

SQL索引事务 索引 创建主键约束(primary key),唯一约束(unique),外键约束(foreign key)时,会自动创建对应列的索引 1.1 查看索引 show index from 表名 现在这个表中没有索引,那么我们现在将这几个表删除之后创建新表 我们现在建立一个班级表一个学生表,并且学生表与班级表存…

HMI 的 UI 风格创新无限

HMI 的 UI 风格创新无限

pyvtk设置lod

LOD&#xff08;Level of Detail&#xff09;是计算机图形学中用于优化渲染性能和显示质量的一种技术。在PyVTK中&#xff0c;可以通过设置不同级别的多边形数据来实现LOD。 以下是一个简单的例子&#xff0c;展示如何在PyVTK中设置LOD&#xff1a; import vtk# 创建一个立方…

Laravel中间件:构建强大Web应用的基石

Laravel中间件&#xff1a;构建强大Web应用的基石 在Laravel框架中&#xff0c;中间件提供了一种强大的方法来过滤HTTP请求和响应。它们可以用于认证用户、授权用户执行特定操作、记录请求信息、处理异常等。本文将详细探讨如何在Laravel中使用中间件&#xff0c;包括创建中间…

什么地方适合安装自动气象站?

随着科技的不断进步&#xff0c;自动气象站在气象观测、环境监测以及科研教学等领域发挥着越来越重要的作用。 一、科研机构和高校校园 科研机构和高校校园是安装自动气象站的理想场所。这些地方拥有专业的科研团队和丰富的教育资源&#xff0c;可以为气象站的建设和运营提供有…

Unity 之基于URP使用UniStorm Weather System天气系统

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之基于URP使用UniStorm Weather System天气系统 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、…

守护企业信用 赢得持续发展 路劲境外美元债调整方案获通过

路劲境外美元债调整方案于7月3日经特别决议案大会批准获正式通过&#xff0c;集团存量5笔美元高级债获得同意展期3.5年&#xff0c;1笔美元永续债获得同意将利率重设日期延后3.5年。这一方案的通过&#xff0c;体现了投资人对路劲的经营能力和长远发展的信心&#xff0c;也标志…

掌握高效实用的VS调试技巧

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 1.编程常见的错误 1.1编译型错误 编程编译型错误是指在编译代码时发现的错误。编译器在编译过程中会检查代码是否符合语法规范和语义要求&#xff0c;如果发现错误会产生编译错误。 直接看错误提示信息&#xff08;双击&#…

用asp开发邮件群发功能

在ASP中群发邮件&#xff0c;可以使用CDO (Collaboration Data Objects) 或JMail组件。以下是好代码网使用CDO的一个简单示例&#xff1a; <%配置邮件服务器信息 Dim mail Set mail Server.CreateObject("CDO.Message") mail.Configuration.Fields.Item _("…

数据库安全审计系统:满足数据安全治理合规要求

伴随着数据库信息价值以及可访问性提升&#xff0c;使得数据库面对来自内部和外部的安全风险大大增加&#xff0c;如违规越权操作、恶意入侵导致机密信息窃取泄漏&#xff0c;但事后却无法有效追溯和审计。 国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数…

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

目录 一、什么是 Collabora Online?二、Docker 下载并启动 CODE2.1 拉取镜像2.2 启动镜像2.3 访问界面2.4 补充:nextcloud 的镜像启动三、SpringBoot 实现 WOPI 服务3.1 什么是WOPI?3.2 Spring Boot 简单实现3.3 另一种实现方式3.4 总结四、补充:coolwsd.xml 核心配置介绍c…

通感一体化技术在低空无人经济中的应用

通感一体化技术通过部署大规模天线阵列等方式&#xff0c;实现对低空区域的网络覆盖。利用基站的可组网特性&#xff0c;为低空作业提供稳定、连续、高速且可靠的无缝覆盖通信网络。同时&#xff0c;AAU&#xff08;有源天线&#xff09;具有感知信号自发自收、高效组网、多波束…

中英双语介绍美国的州:南达科他州(South Dakota)

中文版 南达科他州简介 南达科他州&#xff08;South Dakota&#xff09;位于美国中北部&#xff0c;以其壮丽的自然景观、丰富的文化历史和多样的经济结构而闻名。以下是对南达科他州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 …