从零实现一套低代码(保姆级教程)【运行时】 --- 【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没有写出来造成的,如下图。

【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;删除文件夹即可。但是删除…

SQL索引事务

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

HMI 的 UI 风格创新无限

HMI 的 UI 风格创新无限

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

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

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

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

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

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

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

伴随着数据库信息价值以及可访问性提升&#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…

LeetCode 1327, 383, 236

目录 1327. 列出指定时间段内所有的下单产品题目链接表要求知识点思路代码 383. 赎金信题目链接标签思路代码 236. 二叉树的最近公共祖先题目链接标签思路代码 1327. 列出指定时间段内所有的下单产品 题目链接 1327. 列出指定时间段内所有的下单产品 表 表Products的字段为…

matlab 干涉图仿真

目录 一、算法概述1、干涉图2、生成步骤 二、代码实现三、结果展示 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、算法概述 1、干涉图 干涉图是两束或多束相干光波相遇时&#xff0c;它们的振…

【软件测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录 自动化测试一、selenium1.相关介绍1.Selenium IDE2.Webdriverwebdriver的工作原理&#xff1a; 3.selenium Grid 2.Selenium Java环境搭建3.常用API的使用1.定位元素2.操作测试对象3.添加等待4.打印信息5.浏览器的操作6.键盘事件7.鼠标事件8.定位一组元素9.多层框架定…

[笔记] 卷积03 - 运算的对称性 时域构建高通滤波器的失败尝试

1.卷积运算具备足够好的对称性 1.在计算卷积时&#xff0c;两个函数的位置是可以颠倒的&#xff0c;对吧&#xff1f; 在卷积运算中&#xff0c;确实可以对参与卷积的两个函数进行颠倒。这是因为卷积的定义是通过一个函数与另一个函数的翻转后的形式进行积分运算。具体来说&a…

DPDK概述

文章目录 1. DPDK概述1.1 DPDK 内存管理Mbuf单帧结构:1.2 DPDK内核驱动 igb_uio驱动1.3 DPDK源码下载方式1.4 pktgen源码下载方式1.5 DPDK相关名词解释 1. DPDK概述 Intel DPDK全称Intel Data Plane Development Kit&#xff0c;是Intel提供的数据平面开发工具集&#xff0c;为…

第十三章 Nest Middleware

在上一章我们了解到Nest 并不直接依赖Express 可以切换到别的http 请求处理库 创建项目&#xff1a; nest new middleware-test -p npm创建 middleware &#xff1a; nest g middleware test --no-spec --flat这时候可以看到 req 和 res 的类型都是为 any类型 所以并不知道使…

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void p…

实验四 SQL的数据定义语句

题目 通过SQL语句创建名为ecommerce1的数据库&#xff1a;CREATE DATABASE ecommerce1 2、在数据库ecommerce1中练习模式的创建和删除语句&#xff08;如给用户li创建一个学生管理模式“S-T”&#xff09;&#xff08;需要先添加一个用户li&#xff09; 3、在数据库ecommerce1中…

7月4号直播预告 | 全国产EtherCAT运动控制器ZMC432HG及其EtherCAT总线使用

EtherCAT运动控制边缘控制器是工业互联网的关键组件之一&#xff0c;结合丰富的运动控制功能、实时数据采集、处理和本地计算等&#xff0c;具备高度灵活的可编程性和出色的运动控制性能&#xff0c;为运动控制协同工业互联网应用带来巨大市场潜力&#xff0c;同时也使其成为企…