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

BI磁吸布局 (2) 基于react-grid-layout扩展的布局方式

上一篇深入react-grid-layout源码已经讲了其实现,但是react-grid-layout目前并不支持嵌套拖拽等,因为其底层没有处理。
这一篇是基于react-grid-layout扩展的,支持可嵌套的一些思路以及实现。

这是react-grid-layout的实现
在这里插入图片描述
我们的思路大概是这样的
在这里插入图片描述

  • 舍弃掉DraggableCore层,舍弃mouse事件,改成drop事件
  • 给每个item监听onDragStart,通过盒子监听onDragOver获取元素移动事件,通过onDragOver判断是否到当前的容器,通过onDragLeave判断是否离开了当前容器。
  • 因为是多个容器,所以需要一个Context上下文存储对应的变量。

先看下效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Context层

在这里插入图片描述
因为是多个容器的,所以需要一个contetxt层来记录一些变量,以及做滚动处理,比如鼠标拖拽移动到页面上方/下方,窗口要跟着滚动。

Layout-Item层

在这里插入图片描述
主要是去掉core层,去掉mouse事件,改成监听onDragStart事件。记录当前的位置信息。

Layout-box层

在这里插入图片描述
主要是监听drop等相关事件。具体的流程是

单层拖拽
  • 点击 item.onDragStart
  • box.onDragStart
  • 拖拽 触发 box.onDragOver
  • 触发item的moveDroppingPostion 触发 item.onDrag
  • 放下 触发box.onDrop
  • 触发 item.onDragStop
  • 清除变量,触发onChange修改外部layout。
  • 触发onDragEnd事件,兼容拖动到窗口外放下的情况。
两容器之间拖拽
  • 点击 item.onDragStart → box.onDragStart 拖拽 box.onDragOver → moveDroppingPostion → item.onDrag (单层拖拽逻辑)
  • 移到另一个容器box2 触发 box1.onDragLeave(记录当前离开盒子box1相关信息) → box2.onDragEnter(在box2中新创建一个newItem) → box2.onDragOver → newItem.moveDroppingPostion → newItem.onDragStart/item.onDrag
  • 放下 box2.onDrop → box2.onPropDrop(触发对应事件,只有两个容器需要触发onChange,一个是最后放下的容器,一个是最开始离开的容器,其他经过的容器的结构是一定不会变的)
嵌套拖拽
  • 点击 item.onDragStart → box.onDragStart 拖拽 box.onDragOver → moveDroppingPostion → item.onDrag
  • 移动子容器里面 box1.onDragLeave(记录box1相关信息) → box2.onDragEnter → box2.onDragOver → moveDroppingPostion → item.onDragStart/item.onDrag
  • 放下 box2.onDrop → box2.onPropDrop(触发onChange)

嵌套拖拽/两容器拖拽的逻辑其实差不多。

单层拖拽实现逻辑

嵌套拖拽实现逻辑

边界判断

其他问题解决

未完待续…

http://www.dtcms.com/a/410667.html

相关文章:

  • python(42) : 监听本地文件夹上传到服务器指定目录
  • c 网站建设报告外贸企业网站推广
  • 成都网站建设熊掌号网站 域名 授权服务器 分布式
  • 使用python+flask设置挡板
  • WinCC监控系统实战解析:打通物联网网关的关键步骤
  • 阜宁做网站需要多少钱厦门彩页设计
  • 【Android】 android suspend/resume总结(3)
  • 【Android】Android项目目录结构及其作用
  • 动易网站首页制作移动网站排名教程
  • 网站开发和ipv6便宜网站建设 优帮云
  • 前端笔记:HTML output标签介绍及用法
  • Atlas Mapper 教程系列 (6/10):Spring Boot 集成与自动配置
  • 挂马网站现象基于PHP网站开发的管理系统设计与开发
  • DSP28335开发中的Flash与RAM模式切换详解
  • 海珠建网站公石狮网站建设公司哪家好
  • 网站建设电话销售录音建行个人网上登录入口
  • Python全栈项目:基于深度学习的语音识别系统
  • 语音识别-流式和非流式实现方式
  • 网站被攻击 是vps问题还是dz程序建设网站的经验
  • uniapp中pinia(setup语法)使用流程
  • SimpleBEV:改进的激光雷达-摄像头融合架构用于三维目标检测
  • 一个网站制作流程qq快速登录入口
  • Flash Attention学习笔记
  • 解决 QGraphicsDropShadowEffect 导致的 UI 持续刷新
  • 用 LoRA 微调 Qwen3-0.6B 模型,打造专属宠物商店智能客服
  • 建搜索引擎网站衡东网络推广公司
  • Go test 命令完整指南:从基础到高级用法
  • apifox认证登录自动化
  • 江西网站建设哪家专业女装wordpress
  • IDEA JVM优化配置idea64.vmoptions - 保守兼容版本 兼容IDEA 2023.3.6版本【亲测可用】