从零实现一套低代码(保姆级教程) --- 【15】实现轮播图组件并增加容器子节点类型的控制

摘要

接上一篇,我们继续实现另外一个比较常见的组件。轮播图,在一些官网的页面中,这个组件是非常常见的。

如果你是第一次看到这一篇文章, 建议先看一下第一节内容:
从零实现一套低代码(保姆级教程) — 【1】初始化项目,实现左侧组件列表

那如果你是从基础开始学前端的,那么轮播图组件也是一个作为入门实现的组件。那我们现在要把这个组件,加入到我们的低代码项目中,来进行实现。

在这里插入图片描述

1.组件子节点的类型控制

在实现之前,我们先考虑一个问题。就是容器下都应该可以放置什么节点。

如果我在Form表单组件里面,放一个卡片。当然,代码是可以实现的,但是我们没有必要这么做,所以我们需要给子节点一些类型的控制。比如Form表单下就应该只有一些输入框之类的。

那我们可以在mainPart中新建一个staticUtils,然后在里面将容器的子节点类型存储起来。

在这里插入图片描述

在includes.ts中,我们根据容器类型,来确定它的子节点的类型。
我这里举个例子,读者可根据自己的情况进行修改。

const includesList: {[key: string]: string[] } = {Form: ['Input', 'Checkbox', 'Radio', 'Rate', 'Switch'],Card: ['Input', 'Checkbox', 'Radio', 'Rate', 'Switch', 'Button','Icon','Alert','Progress','Avatar','QrCode','Tag'],Badge: ['Button','Avatar']
}export {includesList
}

因为我们现在只实现了三个容器,所以我们这里不会有很多的代码,OK,增加好了规则后,我们就要到onDropContainer方法中,进行修改了。

我们知道,拖拽到容器中有两个逻辑:

  1. 从左侧组件列表拖拽
  2. 从画布区进行拖拽

针对于这两种情况,我们分别做出对应的处理:

  if(!includesList[com.comType].includes(dragCom?.comType)) {e.stopPropagation()message.error('该容器下不支持拖拽该类型组件');return;}
  if(!includesList[com.comType].includes(nowCom)) {e.stopPropagation()message.error('该容器下不支持拖拽该类型组件');return;}

这个时候,我们会发现,onDropContainer这个方法有点太大了,而且我不确定后期还会不会再继续添加代码,所以我们看看能不能给它拆开,并且给它移出去。(当然你不干这个也行,主要这么做代码会好看一些)

  const onDropContainer = (com: ComJson) => {return (e: any) => {const dragCom = getComById(dragComId, comList)if(Object.keys(includesList).includes(com.comType)) {// 如果是画布区的拖拽要先将节点从comList中删除掉if(dragCom && dragCom !== com) {mainDropContainer(e, com, dragCom, comList);setDragComId('')return;}else if(dragCom){// 拖拽的是容器本身return;}// 从左侧列表进行拖拽leftDropContainer(e, com, nowCom, componentTextMap, comList);}}}

XinBuilder2\src\pages\builder\mainPart\staticUtils\include.ts

import { ComJson } from "..";
import { message } from 'antd';
import Store from "../../../../store";
import { ComponentTextMap } from "../../leftPart/staticUtil/iconList";
let num = 1;const includesList: {[key: string]: string[] } = {Form: ['Input', 'Checkbox', 'Radio', 'Rate', 'Switch'],Card: ['Input', 'Checkbox', 'Radio', 'Rate', 'Switch', 'Button','Icon','Alert','Progress','Avatar','QrCode','Tag'],Badge: ['Button','Avatar']
}const mainDropContainer = (e: any, com: ComJson, dragCom: ComJson, comList: ComJson[]) => {if(!includesList[com.comType].includes(dragCom?.comType)) {e.stopPropagation()message.error('该容器下不支持拖拽该类型组件');}else{const index = comList.findIndex((item: any) => item.comId === dragCom?.comId);if(index > -1) {comList.splice(index, 1)}if(!com.childList) {com.childList = []}delete dragCom.stylecom.childList.push(dragCom);Store.dispatch({type: 'changeComList', value: comList})e.stopPropagation()}
}const leftDropContainer = (e: any, com: ComJson, nowCom: string, componentTextMap: ComponentTextMap, comList: ComJson[]) => {if(!includesList[com.comType].includes(nowCom)) {e.stopPropagation()message.error('该容器下不支持拖拽该类型组件');}else{let comId = `comId_${Date.now()}`const comNode = {comType: nowCom,comId,caption: componentTextMap[nowCom] + num++}if(!com.childList) {com.childList = []}com.childList.push(comNode);Store.dispatch({type: 'changeComList', value: comList})e.stopPropagation()}
}export {includesList,mainDropContainer,leftDropContainer
}

这样我们就把。从画布区拖拽到容器里,和从左侧列表拖拽到容器里的方法,拆分出来了。

相关的代码提交在github上:
https://github.com/TeacherXin/XinBuilder2
commit: 第十五节: 增加容器子节点的类型控制

2.增加轮播图组件

这个添加组件的过程我就不重复说了,要记得吧把includes里面补充一下:

const includesList: {[key: string]: string[] } = {Form: ['Input', 'Checkbox', 'Radio', 'Rate', 'Switch'],Card: ['Input', 'Checkbox', 'Radio', 'Rate', 'Switch', 'Button','Icon','Alert','Progress','Avatar','QrCode','Tag'],Badge: ['Button','Avatar'],Carousel: ['Button']
}

这里我就在轮播图里面只能拖入Button组件了。

在这里插入图片描述

3.补充轮播图组件的属性和样式

在这里插入图片描述

依旧根据antD文档的组件进行补充:

在这里插入图片描述

相关的代码提交在github上:
https://github.com/TeacherXin/XinBuilder2
commit: 第十六节: 增加轮播图组件

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

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

相关文章

一个Pygame的Hello World示例程序

创建一个标题为Hello World的窗口,窗口中间显示有Pygame的Logo的python代码 import sys import pygamedef main():pygame.init()screen pygame.display.set_mode((800, 400))pygame.display.set_caption("Hello World")logo pygame.image.load("p…

2024 年 API 管理新趋势预测

本文译自:What Will Be the API Management Trends for 2024? 原文链接:What Will Be the API Management Trends for 2024? - The New Stack 原文作者:Kenn Hussey 预计到 2030 年末,API 管理 市场的规模将增长六倍&…

php 的判断语句

目录 1.if 2.else 3.elseif /else if 4.while 5.do-while 6.for 7.foreach 8.break 打断 9.contiun 继续 10.switch 1.if 判断语句为 true 则执行 if 里面的语句&#xff0c;否则不执行&#xff1b; <?php header("Content-Type: text/html; charsetutf-8&…

C++ Primer 第五版 中文版 阅读笔记 + 个人思考

C Primer 第五版 中文版 阅读笔记 个人思考 第 10 章 泛型算法10.1 概述练习10.1练习10.2 第 10 章 泛型算法 泛型的体现&#xff1a;容器类型&#xff08;包括内置数组&#xff09;&#xff0c;元素类型&#xff0c;元素操作方法。 顺序容器定义的操作&#xff1a;insert&a…

Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)

开发框架学习笔记 一.Spring SpringMVC SpringBoot三者的联系SpringMVC工作原理 二.SpringBoot的学习框架学习 2.各个类之间的继承和实现关系3.理解面向对象的思想(其实这个想写在2中的)四.开发常用工具Lombok4.0说在前面(如何快速使用Lombok)4.1了解Lombok4.2Lombok的作用一:减…

Clion断点无效(LLDB调试器)

使用Clion时&#xff0c;配置的编译器是Visual Studio&#xff0c;当中的Debugger只有选择LLDB。 项目是CMAKE类型&#xff0c;这里启动调试会发现断点无法命中。 先检查项目的CMakeLists.txt&#xff0c;发现如下配置会影响&#xff1a; set(CMAKE_BUILD_TYPE Debug) set(CM…

云服务器搭建GitLab

经验总结&#xff1a; 1、配置需求&#xff1a;云服务器内存最低4G 2、内存4G的云服务器&#xff0c;在运行容器后&#xff0c;会遇到云服务器操作卡顿问题&#xff0c;这里有解决方案 转载&#xff1a;服务器搭建Gitlab卡顿解决办法-CSDN博客 3、云服务器的操作系统会影响…

第二证券:如何判断主力是在洗盘还是出货?

怎样判别主力是在洗盘仍是出货&#xff1f; 1、依据股票成交量判别 在洗盘时&#xff0c;个股的成交量与前几个生意相比较&#xff0c;呈现缩量的状况&#xff0c;而出货其成交量与前几个生意日相比较呈现放量的走势。 2、依据股票筹码分布判别 洗盘首要是将一些散户起浮筹…

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通

20240109适配selinux让移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通 2024/1/9 10:46 缘起&#xff1a;使用友善之臂的Android11可以让EC20上网&#xff0c;但是同样的修改步骤&#xff0c;Toybrick的Android11不能让EC20上网。 最后确认是selinux的问题&#…

BlogPark测试报告

目录 一&#xff0c;项目背景 二&#xff0c;项目功能 三&#xff0c;测试计划 3.1 测试用例的设计 3.2 功能测试 1.正常登录 2.正常写博客测试 &#xff08;输入完整的标题和内容&#xff09; 3.发布博客之后跳转到详情页观察是否有刚发布的博客 4.删除博客观察列表的…

漫漫数学之旅004

文章目录 经典格言数学习题古今评注根号的故事数学家小传(一)乔治波利亚(二) 克里斯托弗鲁登道夫经典格言 数学包括用最迂回曲折的方式证明最显而易见的事实。——乔治波利亚(Gorge Polya) 乔治波利亚(George Polya)的这句名言揭示了数学证明的本质和魅力。在数学中,…

非工程师指南: 训练 LLaMA 2 聊天机器人

引言 本教程将向你展示在不编写一行代码的情况下&#xff0c;如何构建自己的开源 ChatGPT&#xff0c;这样人人都能构建自己的聊天模型。我们将以 LLaMA 2 基础模型为例&#xff0c;在开源指令数据集上针对聊天场景对其进行微调&#xff0c;并将微调后的模型部署到一个可分享的…

华为 1+X《网络系统建设与运维(高级)》认证模拟实验上机试题

华为 1X《网络系统建设与运维&#xff08;高级&#xff09;》认证模拟实验上机试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案(非常重要) 三、考试正文3.1注意事项3.2校区内&#xff08;LAN&#xff09;3.2.1任务 1&#…

上门洗衣洗鞋小程序多门店管理模式是怎么样的

做干洗店和洗鞋店的老板们很多都不止一个门店&#xff0c;多门店的管理模式下&#xff0c;去做一个上门洗衣洗鞋小程序&#xff0c;需要有哪些必要的功能才能让不同的门店管理起来不乱呢。首先需要先确定一下不同门店的管理都会面临哪些经营场景和需求。 第一&#xff0c;加盟店…

Qt5插件开发入门+示例

目的 1、为什么用插件 现在大家最讲模块化开发了,怎么算模块化,分成不同的类,分成不同的文件夹,高内聚,低耦合,这个当然算是。 从高层次讲,它们是在一起的,只是逻辑上的模块化,不是物理上的模块化,或者说不是彻底的模块化,彻底的模块化应该像一个辆自行车一样,车…

计算机毕业设计-----ssm+mysql医药进销存系统

功能介绍 医药进销存系统&#xff0c;主要功能包括&#xff1a; 公告管理&#xff1a;发布公告、公告列表&#xff1b; 生产管理&#xff1a;订单列表、增加生产、订单日志&#xff1b; 分店采购&#xff1a;分店审核、采购&#xff1b; 总店仓库&#xff1a;出库管理、仓库列…

2024 Midjourney 基础教程(⼆):了解 Midjourney Bot 和AI绘画使用技巧进阶教学

在上⼀篇⽂章中&#xff0c;我们学到了如何注册 Midjourney &#xff0c;开通付费订阅&#xff0c;并画出了可能是⾃⼰的第⼀张 AI绘画。怎么样&#xff1f;这种将想象的画⾯&#xff0c;变为现实世界图⽚的感觉。 是否有种造物者的错觉&#xff0c;同时有种开盲盒的惊喜感&…

市域治理一体化综合指挥平台解决方案:PPT全文42页,附下载

关键词&#xff1a;市域社会治理&#xff0c;智慧网格&#xff0c;市域社会治理现代化&#xff0c;智慧网格综合管理平台&#xff0c;市域治理 一、市域治理&#xff08;智慧网格&#xff09;一体化建设需求分析 1、职能部门需求&#xff1a;职能部门在市域治理中发挥着主导作…

关于谷歌浏览器如何将背景换为黑色,字体换为白色

一.关于chorme浏览器如何换色 #跟着我一起来看一下吧 操作步骤 步骤 1.在谷歌的搜索框里搜索此网址——chrome://flags/ 如图 2.访问此网址 如图 3.我们在搜索框搜索:Auto Dark Mode for Web Contents 如图 4.开启Web内容的自动暗模式 选择enbled 5.确认重新启动 选择…

126.(leaflet篇)leaflet松散型arcgis缓存切片加载

地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP