最新要闻
- 焦点讯息:索尼再次动刀!宣布电视、相机等产品即将涨价14%
- 全球实时:魅族20外观设计现身:极窄直屏边框颜值在线
- 每日看点!蔚来车主占三个车位充电引争议 汽车博主:好像只能这么充
- 男孩打开新年礼盒发现是试卷后大哭:寒假作业还没有写完
- 天天视讯!漠河零下53℃极寒 有居民屋里穿短袖!网友集体羡慕:我们这取暖靠抖
- 当前快播:2022年度中国汽车保值率:日系车屠榜 秒杀BBA豪华车
- 环球热头条丨比亚迪或进军保险业 将全资接盘易安财险
- 春运时间翻倍!电动车车主称油车返乡8小时 他开了15小时
- 每日视讯:《满江红》票房逆跌 成春节档冠军!张艺谋刷新个人纪录
- 天天速讯:海外观众评价《流浪地球2》:不比《星际穿越》差
- 速度高达9.6Gbps!SK海力士发布全球最快移动DRAM
- 世卫组织:全球50亿人无法避免反式脂肪 会致命的有毒化学物质
- 在家享受牛奶SPA!舒蕾沐浴露大促:10元/斤
- 世界头条:马斯克或参与特斯拉自动驾驶视频造假?细节曝光
- 观速讯丨微软裁员1万人 遣散费高达8亿美元 平均每人获赔54万元
- MiniLED国货崛起?2023年的电视不太好下手
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日信息:vue-grid-layout数据可视化图表面板优化过程所遇问题汇总
对于drag事件不熟悉的,请先阅读:《drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践》
之前老项目grafana面板,如下图所示(GEM添加图表是直接到图表编辑,编辑完成后自动插入到面板最后):
(资料图片仅供参考)
产品希望做成从左侧拖曳进入,所见即所得,如图所示:
这个vue-grid-layout 本身就是支持:
https://jbaysolutions.github.io/vue-grid-layout/guide/10-drag-from-outside.html
为了性能,项目本身升级到vue3,因为整个项目采用TSX,本人改造的版本:https://github.com/zhoulujun/vue3-grid-layout
看了下案例代码:https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example10DragFromOutside.vue
整个代码如果用在工程里,肯定会卡死,因为:
drag:function(e){letparentRect=document.getElementById("content").getBoundingClientRect();}
这个代码为什么不行?首先这个里面拖动计算直接在drag事件里面做的,其次这个案例drogover 是绑定在body上面,如果组件里面也需要接收左侧的拖曳组件,实现很麻烦:
首先,我们解决卡顿问题,其中比较隐蔽的是回流问题,造成掉帧严重
回流问题:
其实很多初级的前端同学只知道JS改变CSS会让浏览器回流,其实JS读取某些属性也会让浏览器回流,比如
js请求以下style信息时,触发回流(浏览器会立刻清空队列:)
clientWidth、clientHeight、clientTop、clientLeft
offsetWidth、offsetHeight、offsetTop、offsetLeft
scrollWidth、scrollHeight、scrollTop、scrollLeft
width、height
getComputedStyle()
getBoundingClientRect()
具体查看:《chrome对页面重绘和回流以及优化进行优化》:https://www.zhoulujun.cn/html/webfront/browser/webkit/2016_0506_7820.html
这个在drag里面即使加了防抖,组件多了照样会卡死页面的。
还有有些实现还使用了Bus 透传 drag/dragend 事件,其实这里可能没有理解 :
针对对象 事件名称 说明 被拖动的元素 dragstart 在元素开始被拖动时候触发 drag 在元素被拖动时反复触发 dragend 在拖动操作完成时触发 目的地对象 dragenter 当被拖动元素进入目的地元素所占据的屏幕空间时触发 dragover 当被拖动元素在目的地元素内时触发 dragleave 当被拖动元素没有放下就离开目的地元素时触发 整个拖拽事件触发的顺序如下:dragstart-> drag -> dragenter -> dragover -> dragleave -> drop ->dragend
https://www.zhoulujun.cn/html/webfront/SGML/html5/2016_0124_434.html
理解了这个,其实直接在dragover 做就可以了,这个案例给很多开源项目做了些误导哈*_*
既然
整个拖拽事件触发的顺序如下:dragstart-> drag -> dragenter -> dragover -> dragleave -> drop ->dragend,
那么在dragstart时在dataTransfer.setData,在后续的过程中直dataTransfer.getData读取就行行了吗?
dataTransfer.getData()在dragover,dragenter,dragleave中无法获取数据的问题
dataTransfer.getData()在dragover,dragenter,dragleave中无法获取数据的问题
dataTransfer.setData()中所设置的数据是存储在drag data store中,而根据W3C标准,drag data store有三种模式,Read/write mode, Read-only mode跟Protected mode。
W3C Working Draft中5.7.2.关于三种drag data store mode的定义
A drag data store mode, which is one of the following:
Read/write mode(读/写模式)
For the dragstart event. New data can be added to the drag data store.
读/写模式,在dragstart事件中使用,可以添加新数据到drag data store中。
Read-only mode(只读模式)
For the drop event. The list of items representing dragged data can be read, including the data. No new data can be added.
在drop事件中使用,可以读取被拖拽数据,不可添加新数据。
Protected mode(保护模式)
For all other events. The formats and kinds in the drag data store list of items representing dragged data can be enumerated, but the data itself is unavailable and no new data can be added.
在所有其他的事件中使用,数据的列表可以被枚举,但是数据本身不可用且不能添加新数据。
具体查看官方文档:https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store
这样就可以解释为什么dragover中dataTransfer.getData()返回的数据为空,以及在dragover时dataTransfer中的types不为0了,因为在除了dragstart,drop以外的事件,包括dragover,dragenter,dragleave中,drag data store出于安全原因处于保护模式,因此不可访问。
如果要实现dragover中访问dragstart中设置的数据,可以采用定义一个全局变量的方法,在dragstart中赋值,之后在dragend中清空。
另外,我在ondragover时,尝试给被拖拽元素添加class以改变其样式发现,虽然拖拽时class已经改变,但在拖拽过程中样式并没有改变,而是等到拖拽动作完成后,也就是drop之后样式才被应用上去,所以在dragover,dragenter,dragleave中做得更多的应该是对数据的处理,而不是应用效果。
drop事件不触发:
在发现页面拖动过程中,drop事件不触发,重新了看了下《drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践》
drop:源对象拖放到目标对象中,目标对象完全接受被拖拽对象时触发,可理解为在目标对象内松手时触发。
dragenter和dragover事件的默认行为是拒绝接受任何被拖放的元素。因此,我们必须阻止浏览器这种默认行为。e.preventDefault();
如果drop接收盒子要想接收到元素,那么接收的拖动元素dragenter和dragover必须阻止默认行为。
发行也阻止默认事件了,但是我使用了节流事件,发现不行:
把e.preventDefault()提取出来就可以,代码如下:
clientX、offsetX、screenX、pageX、x、y、clientLeft、clientTop区别
整体部分可以参看:《再谈BOM和DOM(6):dom对象及event对象位值计算—如offsetX/Top,clentX》
clientX、clientY:点击位置距离当前body可视区域的x,y坐标
pageX、pageY:对于整个页面来说,包括了被卷去的body部分的长度
screenX、screenY:点击位置距离当前电脑屏幕的x,y坐标
offsetX、offsetY:相对于带有定位的父盒子的x,y坐标
所以在drogover 中,直接获取offsetY、offsetX 即可:
const{offsetY:top,offsetX:left}=e;el.dragging.data={top,left};constnew_pos=el.calcXY(top,left);
这样其实是很方便的
整体实现:
代码23年中应该会全部提交github,这里把拖动的钩子函数贴出来供参考下
import{onUnmounted}from"vue";import{BaseHooksData}from"@dashboard/grid-panel/hooks/useHooks";import{IGridPos,PanelModel}from"@/typings";importuseDashboardModuleStore,{getNewPanel}from"@store/dashboard";import{initPanel,VIRTUAL_ROOT}from"@/constants";import{throttle}from"lodash";import{deepClone}from"@/utils";importusePanelEditorStorefrom"@store/panelEditor";importcreateUIDfrom"@/utils/createUID";exportdefaultfunctionuseDragMove(data:Partial,getLayout:()=>void,editChart:(panel:PanelModel)=>void,){const{layout,gridLayoutRef,gridItemRefs,}=data;constPanelEditorModule=usePanelEditorStore();constDashboardModule=useDashboardModuleStore();//移动的临时组件letpanel:PanelModel=null;letdragPos:IGridPos;onUnmounted(()=>{dragPos=null;panel=null;});/***图表拖到仪表盘,穿件图表*@parame*/functiondragenter(e:DragEvent){e.preventDefault();console.log("————————鼠标进入编辑器区域");if(layout.value.findIndex(item=>item.i==="drop")===-1){const{addPanelData=deepClone(initPanel),addPanelType:type}=PanelEditorModule;const{space_uid}=DashboardModule.dashboard;panel=getNewPanel(type,newPanelModel({...addPanelData,uid:"drop",type,space_uid,}));dragPos=panel.gridPos;layout.value.push(dragPos);}}constdragoverThrottle=throttle((e:DragEvent)=>{constindex=layout.value.findIndex(item=>item.i==="drop");if(index===-1){return;}constel=gridItemRefs.value[index];if(!el){return;}const{offsetY:top,offsetX:left}=e;el.dragging.data={top,left};constnew_pos=el.calcXY(top,left);const{h,w}=panel.gridPos;gridLayoutRef.value.dragEvent("dragstart","drop",new_pos.x,new_pos.y,h,w);dragPos.x=layout.value[index].x;dragPos.y=layout.value[index].y;},300);functiondragover(e:DragEvent){e.preventDefault();dragoverThrottle(e);}functionleaveDragArea(refresh=true){const{x,y,h,w}=dragPos;gridLayoutRef.value.dragEvent("dragend","drop",x,y,h,w);//强制隐藏placeholderlett=setTimeout(()=>{if(gridLayoutRef.value.isDragging){gridLayoutRef.value.isDragging=false;}clearTimeout(t);t=null;},100);if(refresh){panel=null;layout.value=layout.value.filter(item=>item.i!=="drop");}}functiondragleave(e:DragEvent){console.log("dragleave");const{offsetX,offsetY,clientX,clientY}=e;if(!((clientX===0&&clientY===0)&&(offsetX<0&&offsetY<0))){console.log("鼠标离开编辑器区域————————");leaveDragArea();}}functiondrop(e:DragEvent){console.log("drop");e.preventDefault();const{type}=panel;leaveDragArea(false);if(["row","tab","column"].includes(type)){constuid=createUID();panel.uid=uid;panel.gridPos.i=uid;DashboardModule.addCharts([panel]);}else{panel.uid=VIRTUAL_ROOT;panel.gridPos.i=VIRTUAL_ROOT;DashboardModule.addCharts([panel]);editChart(panel);}getLayout();}return{dragenter,dragover,dragleave,drop,};}
这是其中拖曳的部分,其中的drop 钩子,可以在tab、swiper、column组件中使用。
代码优化
工程上,当然还得对代码进行拆解,整个仪表盘差不多5000多行代码,vue3可以拆解成多个钩子,方便代码的复用与维护
先写到这吧,后面有时间再理顺一下
每日信息:vue-grid-layout数据可视化图表面板优化过程所遇问题汇总
焦点讯息:索尼再次动刀!宣布电视、相机等产品即将涨价14%
全球实时:魅族20外观设计现身:极窄直屏边框颜值在线
头条:回文数-力扣
每日看点!蔚来车主占三个车位充电引争议 汽车博主:好像只能这么充
男孩打开新年礼盒发现是试卷后大哭:寒假作业还没有写完
天天视讯!漠河零下53℃极寒 有居民屋里穿短袖!网友集体羡慕:我们这取暖靠抖
当前快播:2022年度中国汽车保值率:日系车屠榜 秒杀BBA豪华车
学习笔记——NoSQL数据库;Redis概述;redis中常用的数据类型(key、string)
环球热头条丨比亚迪或进军保险业 将全资接盘易安财险
春运时间翻倍!电动车车主称油车返乡8小时 他开了15小时
每日视讯:《满江红》票房逆跌 成春节档冠军!张艺谋刷新个人纪录
天天速讯:海外观众评价《流浪地球2》:不比《星际穿越》差
速度高达9.6Gbps!SK海力士发布全球最快移动DRAM
世卫组织:全球50亿人无法避免反式脂肪 会致命的有毒化学物质
在家享受牛奶SPA!舒蕾沐浴露大促:10元/斤
世界头条:马斯克或参与特斯拉自动驾驶视频造假?细节曝光
观速讯丨微软裁员1万人 遣散费高达8亿美元 平均每人获赔54万元
MiniLED国货崛起?2023年的电视不太好下手
iPhone 15 Pro相机将迎来质变:5倍潜望长焦赶上安卓阵营
2023春节档票房破40亿!《满江红》14亿票房领跑
环球播报:吃饺子就是得蘸醋 这件事在几亿年前就决定了!
每日观察!印度收到90亿光年外星系无线电信号 天文学家:外星人没有参与
复旦教授:《流浪地球2》不输于近5年任何一部国外科幻大片
天天观速讯丨27年前 中国自研第一台64位超级小型计算机 当时世界最先进
【天天报资讯】《流浪地球2》:当一部电影演到第三个钟头
谁说中国人造不出保时捷?
今日视点:RTX 4090依旧掉帧!SE大作《Forspoken》今日发售:成新一代硬件杀手
全球今日报丨全球汽车畅销榜:美国忠爱大皮卡 国人狂买比亚迪
什么是闭包?
全球新动态:猫咪机器人下国际象棋快逼疯人类 顶级棋手也只能和它打成平局
【天天播资讯】薛之谦发文告别暴雪 自称“曲阳爆叉叉兵一波流王”
mac的m芯片安装gup版本的pytroch,并链接到pycharm
泰山温度-22℃ 游客大雪中抱团 网友感叹:还以为翻拍《长津湖》
每日观点:雷军告别《魔兽世界》:18年前就玩了 感慨万千 再见艾泽拉斯
兔年邮票为啥是蓝色兔子?设计者女儿说出真相
世界速讯:中国影史首个!吴京个人总票房达300亿
一加首款机械键盘来了:水晶旋钮 无小数字键
世界视点!python简单实现对桌面进行实时捕捉画面
小米汽车前脸设计图疯传 王化回应:早期招标设计稿 并非最终版
全球热点!女子吐槽羽绒服到东北变嘎嘣脆 为什么遇冷会变硬?
世界实时:学习笔记——Linux中搜索查找类命令;压缩和解压类;Linux挂载和卸载;进程线程类命令;RPM;YUM
环球热消息:太假了!网友分析《三体》动画B站真实评分为2.1分
焦点速递!《流浪地球2》TC版已流出 官博呼吁大家抵制盗版:文明观影
2023牛客寒假算法基础集训营1 个人题解(ACDHKL)
每日看点!大过年的临时工玩呢 AMD又搞了个乌龙:锐龙7000X3D不能超频
天天简讯:彻底离开中国制造不现实 未来苹果将有25%产品来自印度
世界关注:“终极功率半导体”获突破性进展!金刚石有望成为终极半导体材料
每日动态!NASA第一架电动飞机即将上天 官宣至今已过去7年
世界实时:全球最高安全标准 我国自研第三代核电华龙一号稳步推进:1台年发电100亿度
环球今日报丨学习笔记——CentOS中的时间日期类命令;用户管理类命令(useradd,passwd ,id,su ,userdel,who ,usermod,
天天日报丨RTX 4060 Ti性能、价格逼近RTX 3070 网友质疑:升级图啥
steam春节特卖:11款热卖大作 部分游戏低至2折
读函数式编程思维笔记05_现实应用
每日热点:学习笔记——CentOS中的帮助命令;常用快捷键;文件目录类命令
全球视点!猪肉没有以前香了 我们的餐桌已被洋猪肉占据 鲜香早已不复当年
天天亮点!马斯克为“特斯拉私有化推文案”辩护:本可通过出售SpaceX的股份完成融资
环球快报:阿里云盘TV版上线 电视上直接看网盘里的大片
中科院研发新一代“电力银行”:充满可供20万人用一天
载人登月巨无霸 长征九号重型火箭将于2035年前后首飞
天天实时:国产2TB PCIe 4.0 SSD只要749元:搭载长江存储TLC颗粒 京东自营5年质保
当前报道:俄罗斯黑客攻破《暗黑破坏神4》测试版 自己开私服
世界头条:猫人石墨烯抗菌男士内裤三条装下单9折 29元
AMD官方确认:锐龙7000X3D系列将支持超频
春节档票房破30亿 暂列2023全球第一:《流浪地球2》独占10亿
世界今头条!游客遭遇山寨兵马俑、秦皇陵 大喊退票:专家科普真景点只看这两处
雷军安利MIUI“称呼计算器”:再也不怕过年喊错亲戚了
全球热头条丨499元买iPhone SE的羊毛没了!苹果bug已修复:下单的不认账
滚动:九旬老人花21万买17个金镯子送晚辈!网友羡慕了:满满都是爱
全球即时看!大神挑战32MB内存运行Win7系统 花2年时间减少4MB占用
万兆25Gbps:胜为万兆八类网线7.5米23.9元
清仓抄底:太平鸟夹克/棒球服等199-259元大额券
天天热消息:魔兽等7款暴雪游戏关服 网易公布退款说明:2月1日开放
环球快资讯:C919大飞机即将迎来兔年第一飞:很快就能商业载客了
今日热议:中国暴雪玩家的“最后一天”:走过地图每一处 把自己存进骨灰盒
环球热推荐:男子回应特斯拉充14次电回东北:并没有特别多的充电焦虑
热点!windows11 彻底修改c盘中文用户名
热资讯!8、CSS权威指南--第四章(p121)值和单位
18年青春结束了 魔兽世界国服正式关闭:期待再相逢
世界新动态:通用8位SPI接口模块——verilog实现
【环球报资讯】[概率论与数理统计]笔记:4.2 统计量
【世界聚看点】国产DDR5价格屠夫 金百达32GB 6400MHz内存999元(CL32低延迟)
http基础(随缘更新)
两人合作小品成春晚亮点 马丽回应离开沈腾就不行了:我俩都是1
春节看哪部电影?雷军没选《流浪地球2》 听网友的看了《无名》
易烊千玺主演电影票房破150亿:新片《满江红》正在热映
春节警惕“节日病”:过度饮酒易引发胰腺疾病
【报资讯】气温最低零下53℃ 大兴安岭女子回家发现单元门冻成冰窖
网络编程
【教程】配置多个SSH-Key
世界简讯:MySQL笔记01: MySQL入门_1.2 MySQL下载安装与配置
环球最资讯丨时隔3年 一加将再发概念机:搭载颠覆性技术
全球播报:吴孟达再现《流浪地球2》引热议 网友:看到达叔泪目
天天快播:学习笔记——Liunx中CentOS中的有关(network)的命令;其他命令;关机重启命令
天天快讯:区块链基础入门(一)
全球视点![概率论与数理统计]笔记:4.1 总体与样本
热点在线丨曝iPhone 15 Pro屏幕边框收窄:全系都是灵动岛设计
资讯推荐:漠河零下53℃是什么体验?冻梨能把板砖敲稀碎
PDF划词翻译
带薪撸猫!95后宠托师春节保底收入过万:工作氛围很轻松