当前位置: 首页 > news >正文

ai网页界面设计重庆网站快速排名优化

ai网页界面设计,重庆网站快速排名优化,跑步机网站建设思维导图,做班级网站的实训报告摘要 目前是每天更新一篇, 因为我不止要写文章,这些代码也是我正在敲的。可能速度没有那么快,但是这个频率感觉还是可以的。 本篇是这个系列的第三篇,如果你是第一次看到这个文章,那你应该会对低代码有那么一丢丢兴趣…

摘要

目前是每天更新一篇, 因为我不止要写文章,这些代码也是我正在敲的。可能速度没有那么快,但是这个频率感觉还是可以的。

本篇是这个系列的第三篇,如果你是第一次看到这个文章,那你应该会对低代码有那么一丢丢兴趣或者很有兴趣。从标题来看,也知道我这个系列就是实现一个低代码的项目。

那如果你想知道,我实现的项目的样子是什么样的,可以访问下面的链接:
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
XinBuilder 点击跳转

如果你有兴趣,跟着实现这么一套代码,那么你可以从第一章节开始阅读:
从零实现一套低代码(保姆级教程) — 【1】初始化项目,实现左侧组件列表

因为上一篇文章,没有额外的提交,所有的代码都写在了文章里,所以这里就直接继续上一篇开始说。

在上一篇结束后,我们实现了左侧组件拖拽到画布区的效果!!!

但是因为我们组件里面只有一个文本,所以今天我们主要来实现组件,以及画布区中组件的拖拽。
在这里插入图片描述

1.组件的实现

在上一节中,我们在Button组件中,从props里面接收了style,从而实现组件在画布区的定位效果。

但是之所以显示文本,是因为我们写的就是文本,现在我们给它改成antD里面的Button组件。

import { Button as AntButton } from 'antd'export default function Button(props: any) {const {style} = propsreturn (<div style={style}><AntButton>按钮</AntButton></div>)
}

这里注意一下,因为我的组件就叫Button,如果引入antD的Button时,没有改名会引起报错

你可以有两种解决办法,一种是像我这样,另一种就是修改自己这个组件的名,例如不叫Button,叫XButton即可

当你修改完后,再拖拽组件,那么在画布区显示的就不是一段文本了!!!!

在这里插入图片描述

2.实现画布区的拖拽

现在呢,我们拖拽到画布区的组件,就定死在那里了,不能拖拽,现在我们要给画布区的组件添加拖拽的效果。

现在请读者打开mainPart下的index.jsx文件,看一下最终的return。

我们在遍历comList的时候,返回的Com外层应该包一层div用来实现拖拽的效果。
在这里插入图片描述

同时也要给这个外层的div一个拖拽的方法,onDragStart,由于在画布区拖拽组件,也只能拖拽到画布区,所以我们不需要像上次一样,做一些禁止默认行为的处理了。

  // 画布区的组件拖拽方法const onDragStart = (com: ComJson) => {return () => {}}return (<div onDrop={onDrop} onDragOver={onDragOver} onDragEnter={onDragEnter} className='mainCom'>{comList.map(com => {const Com = components[com.comType as keyof typeof components];// 在外面包一层控制拖拽的divreturn <div draggable onDragStart={onDragStart(com)}><Com style={com.style} /></div>})}</div>)

OK。现在请打开浏览器看一下实现的效果吧,是不是发现有点问题,每次你在画布区拖拽后,都会生成一个新的组件,而不是组件的移动。这是为什么呢?

在这里插入图片描述
答案在我们写的onDrop方法里,因为每次拖拽完都会触发onDrop方法,每次都会push一个新的组件

所以我们应该是从左侧组件列表拖拽的时候,进行push。如果是在画布区拖拽,我们只需要更新style属性即可。

那怎么判断是画布区拖拽的组件还是左侧栏拖拽的组件呢?我们可以在这里的onDragStart里,将window.nowCom设定为一个特殊的值。在onDrop根据这个值去判断走哪条分支。

  // 用于保存当前画布区拖拽的节点const [dragCom, setDragCom] = useState<ComJson | null>(null)const onDrop = (e: any) => {const endLeft = e.clientX;const endTop = e.clientY;const style = {position: 'absolute',left: endLeft + 'px',top: endTop + 'px',zIndex:100}// 判断当前拖拽的节点是从画布区拖拽,还是左侧组件栏拖拽if(window.nowCom === 'renderCom' && dragCom) {dragCom.style = style}else{comList.push({comType: window.nowCom,style})}setComList([...comList])}const onDragStart = (com: ComJson) => {return () => {// 设置拖拽的节点和nowCom的固定值window.nowCom = 'renderCom';setDragCom(com)}}

现在请再看一下效果,在画布区的拖拽就已经解决了。
但是呢,是不是位置不太准确呢

3.计算组件拖拽后的位置

好像在画布区拖拽完组件,新的位置总是差了那么一点,这是为什么呢?
先给一点提示,如果你拖拽的时候,鼠标位置在组件的左上角,那就没有问题了。

答案是,你给组件的left和top的定位,是基于鼠标位置的,也就是说,你把鼠标距离顶部和左部的距离,给了组件,那如果组件有自己的宽高,那么这个定位就是不准的。

所以为了算出正确的位置,我们应该计算出鼠标向左移动的距离和向上移动的距离。
然后加上组件本身的left和top值。

组件位置.left = 组件旧位置.left + 鼠标向左移动的距离
组件位置.top= 组件旧位置.top+ 鼠标向上移动的距离

那怎么计算鼠标移动的距离呢?我们可以在dragStart中,保存鼠标的位置。drop事件里,再保存一下鼠标的位置,诶?两者的差值不就是鼠标移动的位置嘛?
简单画一下流程图:

在这里插入图片描述

  // 用来保存鼠标的开始位置和结束位置const distance = useRef<Distance>({startLeft: void 0,startTop: void 0,endLeft: void 0,endTop: void 0})const onDragStart = (com: ComJson) => {return (e: any) => {window.nowCom = 'renderCom';setDragCom(com);// 开始位置distance.current.startLeft = e.clientX;distance.current.startTop = e.clientY;}}const onDrop = (e: any) => {// 鼠标的结束位置distance.current.endLeft = e.clientX;distance.current.endTop = e.clientY;let style: any;if(window.nowCom === 'renderCom' && dragCom && dragCom.style) {// 根据鼠标位置的差值计算组件位置dragCom.style = {...dragCom.style,left: parseInt(dragCom.style.left) + (e.clientX - (distance.current.startLeft || 0)) + 'px',top: parseInt(dragCom.style.top) + (e.clientY - (distance.current.startTop || 0)) + 'px'}}else{style = {position: 'absolute',left: distance.current.endLeft + 'px',top: distance.current.endTop + 'px',zIndex:100}comList.push({comType: window.nowCom,style})}setComList([...comList])}

基于上面的实现,我们就完成了组件在画布区的拖拽了。

本章内容会提交在github上:
https://github.com/TeacherXin/XinBuilder2
commit: 第三节:实现Button组件和画布区的拖拽

博主补充

那如果现在你已经完成了所有的过程,你可以自己把其他组件的代码也补充一下。
我会在github上提交一段代码,用来补充文本框组件的代码,内容可以在github上查看

https://github.com/TeacherXin/XinBuilder2
commit: 第三节:实现Input组件代码

第二个问题,为什么鼠标的位置我们通过useRef来进行存储。因为这四个变量不需要更新去渲染组件,所以没必要通过useState去管理。但是呢,每次更新组件的时候还需要拿到之前的值,所以我们使用useRef进行管理。

第三个问题,现在我们有comList保存所有的组件数据,dragCom保存在画布区拖拽的组件。这个在后面,我们会采用redux进行管理,会有所更改,目前的话我们先使用这种模式来把整个流程串通。

最后,博主的TS可能没有那么熟练,如果有建议的话,博主也会积极采纳的!!!!


文章转载自:
http://tephroite.nrpp.cn
http://smallness.nrpp.cn
http://lysine.nrpp.cn
http://memento.nrpp.cn
http://rooseveltiana.nrpp.cn
http://molestation.nrpp.cn
http://skirting.nrpp.cn
http://purchase.nrpp.cn
http://matrilocal.nrpp.cn
http://congelation.nrpp.cn
http://reproachingly.nrpp.cn
http://transverse.nrpp.cn
http://chasteness.nrpp.cn
http://emphysema.nrpp.cn
http://mythopeic.nrpp.cn
http://exhaustive.nrpp.cn
http://transition.nrpp.cn
http://trinitrobenzene.nrpp.cn
http://reast.nrpp.cn
http://submissive.nrpp.cn
http://decad.nrpp.cn
http://scua.nrpp.cn
http://squattocracy.nrpp.cn
http://cumber.nrpp.cn
http://recollectedness.nrpp.cn
http://malmaison.nrpp.cn
http://nye.nrpp.cn
http://thuringer.nrpp.cn
http://necessary.nrpp.cn
http://undefended.nrpp.cn
http://cyclohexanone.nrpp.cn
http://chubb.nrpp.cn
http://napu.nrpp.cn
http://crawlerway.nrpp.cn
http://athabascan.nrpp.cn
http://underfill.nrpp.cn
http://horizontally.nrpp.cn
http://lepidoptera.nrpp.cn
http://romans.nrpp.cn
http://musicassette.nrpp.cn
http://lanigerous.nrpp.cn
http://isobath.nrpp.cn
http://xanthinuria.nrpp.cn
http://rightward.nrpp.cn
http://clean.nrpp.cn
http://dukawallah.nrpp.cn
http://tequila.nrpp.cn
http://bedkey.nrpp.cn
http://soignee.nrpp.cn
http://cynologist.nrpp.cn
http://tropo.nrpp.cn
http://slimnastics.nrpp.cn
http://harambee.nrpp.cn
http://incombustibility.nrpp.cn
http://sergeancy.nrpp.cn
http://multichannel.nrpp.cn
http://smidgen.nrpp.cn
http://featherhead.nrpp.cn
http://tenzon.nrpp.cn
http://discredit.nrpp.cn
http://inedited.nrpp.cn
http://negrophile.nrpp.cn
http://navalist.nrpp.cn
http://stonecutter.nrpp.cn
http://shapka.nrpp.cn
http://unmannerly.nrpp.cn
http://thrombus.nrpp.cn
http://buckhound.nrpp.cn
http://neckrein.nrpp.cn
http://syncromesh.nrpp.cn
http://actionable.nrpp.cn
http://sightseeing.nrpp.cn
http://zeroth.nrpp.cn
http://lignocellulose.nrpp.cn
http://pyongyang.nrpp.cn
http://wyomingite.nrpp.cn
http://eryngium.nrpp.cn
http://conveyer.nrpp.cn
http://swansea.nrpp.cn
http://enring.nrpp.cn
http://vetch.nrpp.cn
http://ulna.nrpp.cn
http://copperbelt.nrpp.cn
http://nebbish.nrpp.cn
http://sclerodermatitis.nrpp.cn
http://davenport.nrpp.cn
http://amberite.nrpp.cn
http://calfskin.nrpp.cn
http://seminiferous.nrpp.cn
http://krumhorn.nrpp.cn
http://benediction.nrpp.cn
http://pilferer.nrpp.cn
http://patrolette.nrpp.cn
http://trousseaux.nrpp.cn
http://rice.nrpp.cn
http://complementizer.nrpp.cn
http://ethylidene.nrpp.cn
http://deckhead.nrpp.cn
http://botel.nrpp.cn
http://steeve.nrpp.cn
http://www.dt0577.cn/news/79450.html

相关文章:

  • 教做甜点的网站如何制作网站二维码
  • 佛山网站开发企业线上培训平台
  • 基金从业培训网站好搜网惠州seo
  • 张家港做网站哪家好如何做网站推广
  • 诸城 网站 建设怎么优化网站性能
  • 自己做网站能赚到广告费吗外贸建站推广公司
  • 论文收录网站有哪些网络营销毕业论文8000字
  • 没有网站如何做SEO推广有用吗合肥优化排名推广
  • 公众号的微网站开发最新军事新闻事件今天
  • 有哪些网站可以做兼职杭州seo关键字优化
  • 寮步网站建设公司网页设计是干嘛的
  • 北京东城做网站舆情网站入口
  • 锐旗网站建设最近新闻报道
  • 企业官网模板 静态seo必备工具
  • wordpress 二开北京北京seo优化wyhseo
  • 福州公司网站设计推广运营怎么做
  • 网站服务器到期查询怎么发帖子做推广
  • 电子商务专业网站建设西安互联网推广公司
  • 网站做的好的公司有宁波seo外包快速推广
  • 网站添加百度搜索搜索引擎营销的模式有哪些
  • 深圳网络推广方案久久seo正规吗
  • 本地网站做淘宝客天津seo网站推广
  • 宁波做网站nbyckj软文推广经典案例
  • 案例较少如何做设计公司网站推广公司品牌
  • 不用写代码做网站站长工具推荐
  • 在一起做网店的网站的怎么购买百度推广运营工作是什么
  • flash网站as公众号怎么推广和引流
  • 钣金外包加工网北京推广优化经理
  • 佛山建设外贸网站官网设计比较好看的网站
  • 用dede做的网站首页百度指数代表什么意思