当前位置: 首页 > 科技观察

基于自然流布局的可视化拖拽平台设计方案

时间:2023-03-16 02:00:26 科技观察

LowCode是一个高效、高性能的拖放式低代码开发平台。也是笔者近期研究的方向。我写过很多关于可视化平台实现的文章。下面我将带大家探索一个新的方向——基于自然流Layout的可视化搭建平台。在我们之前实现的h5-dooring构建平台中,我们采用网格布局的方式实现拖拽生成H5页面或者Webapp。优点是灵活简单,用户基本没有使用成本。前端层也可以做一定的水平扩展,但是有几个缺陷:嵌套组件实现比较复杂,没有层的概念。层和嵌套的问题虽然可以通过改造来实现,但最近也在尝试实现这个方向(虽然不同于设计的初衷是反驳,dooring的初衷是抹去层的概念和嵌套,让建筑变得扁平化和智能化,所以没有自由布局的方案)但是如果一定要实现嵌套和分层的功能,有没有别的办法?更简单的解决方案怎么样?笔者目前想到的方案有两种:将智能布局改为自由布局,即可以基于自然流实现类似react-resizable的方案,即抹去定位的概念,完全基于顺序文档中的元素、层次结构和定位的选择留给用户。因为作者在dooring前期已经实现了第一个版本,最后放弃了,采用了网格布局,所以下面讨论一下第二种解决方案的实现。基于自然流布局拖拽生成页面自然流布局的好处是我们不需要通过定位来限制元素等信息的位置,而是按照html文档流的方式对元素进行布局,用户可以灵活设置元素的层级(layer)和偏移量(transform)。接下来我们看一下简单的实现效果。1、Demo效果从上图的demo中我们可以发现,画布中组件的布局完全是默认的文档流方式,这样我们就有了更加灵活的布局实现。2.实现思路具体实现思路主要分为以下几个部分:从组件区拖拽到画布上。在画布区域中拖放组件编辑器和更新机制。我们讨论的第一点和第三点在H5-dooring中已经实现。有兴趣的可以看看我之前的文章。这里我们着重实现画布区域的拖放,这也是一个比较核心的环节。2.1H5拖拽api基本介绍拖拽(Draganddrop)是HTML5标准的组成部分,长期以来被大部分浏览器所支持。我们目前使用的拖拽插件基本都是基于H5拖拽API实现的。其实先组件区拖放对于画布,我们可以使用原生实现。下面我简单介绍一下。首先我们来看一个完整的拖拽过程:首先我们要设置一个元素为可拖拽(举例),设计拖拽时会发生什么(需要ondragstart事件放在哪里,setData(你要的数据通过),也就是目标容器(通常在目标容器上绑定ondragover和ondrop事件)通过以上三步,我们就可以实现第一点作者写了一个简单的demo,供大家参考:

是对应的我们组件的拖拽区域,如下图:2.2Reacanvas区域拖拽布局的化因为我们在之前的版本中使用了网格布局来实现智能拖拽,由于内部定位机制采用绝对定位,所以很难实现层次化和固定化的组件。如果组件的呈现完全不受定位的约束,我们就可以实现上述困境。所以在这里我们研究了一个解决方案———拖放排序机制。自然流式布局的规律是,默认情况下,html页面是按照dom出现的先后顺序排列的,也就是我们所说的堆叠。我们可以按照这种设计,通过排序改变组件的位置,从而实现自然流式布局的页面构建。那我们再回到上面提到的布局问题。比如我们要实现网格布局,只需要定义一个flex容器,将组件拖入容器即可。也解决了嵌套的问题。同时,我们还可以设计嵌套容器中的网格数量,这样就可以实现类似下面的效果:我们可以使用拖拽排序库:sortableVue.Draggablereact-dnd有很多优秀的库,这里就不一一举例了。3、如何实现层次化和嵌套其实我们在上面的实现思路中已经解决了嵌套的问题,即提供拖拽式容器组件,使用作者上面介绍的拖拽式API即可实施的。对于组件层面,由于我们使用自然流式布局,我们可以很方便的设置元素的定位属性。比如我们提供一个定位设置:关于如何设计动态属性Editor,笔者在之前的文章中也有详细介绍,可以参考:表单编辑器实现(FormEditor)以上是自然流的基本实现layout,作者稍后也会在github上同步最新的成果。