如何构建逻辑清晰的可拖拽树的数据结构

  在为知笔记上的每日计划已经有好几天没有写实际内容了,抓狂脸。时间真是过得超级快呀,这几天双十一,疯狂的看喜欢的东西和看快递。其实并不是为了双十一降价而买东西,而是近来本来就有买东西的打算,而且撞到了双十一前,那就干脆放购物车里好了,还有就是半年没见降价的零食也打折啦啦啦~~^_^。好喜欢双十一结束后淘宝的宣传片《再见双十一》,接下来的这个星期,就静静的等待幸福来敲门~

  言归正传,今天来分享一下关于如何构建数据结构使得页面逻辑更为清晰的思路。

  事情的起因是这样的,boss安排我做一个列表拖拽页面,为了更贴切我们的UI和产品的需求,除了美化的滚动条使用jquery.nicescroll插件外,不到万不得已不允许用其他插件(来点题外话:感觉我们公司一般不允许用插件,用boss的话来说就是相信自己能写出来,根据项目写出来的才是最贴切最精炼的代码。不要一开始就使用插件,如果实在写不出来而使用插件,也得完全看懂代码或者使用说明,不要存在一知半解的侥幸心理,这样相当于给项目埋下定时炸弹)。

我起初是用了对象加数组,各种全局变量加起来写着写着很容易把自己的代码写混了,然后把自己的困惑和boss说了之后,boss给我提供了一种新的思路,让我豁然开朗,立即把页面重写了一遍。好东西就是要和大家分享的,下面我来分享一下这个方法。

如图所示,这个页面的要求是能实现以最左边一个虚拟的第0列作为根节点,然后点击三角形(非叶子节点的子节点)实现横向展开收缩数据。每一层都是上一层的子节点,在不同列的子节点中也可以相互拖拽,拖拽上一层节点,下一层节点也跟着移动(由于需要实现每一列都有一个相对的滚动条的功能,所以不能把所有节点都实现绘制在一棵树上通过show,hide展示。需要每展开一列就立即构建一个相对独立的树)。除了拖拽,还需要能实现复制节点(子节点也随之复制),删除,编辑,添加子节点,查看节点下所有叶子节点和本层叶子节点的功能。

  把这些功能归类,我们可以看到拖拽,删除其实是对结构的操作;编辑,查看是对数据的操作;复制,添加子节点这些既要求对树操作,要求对数据进行操作。

当我们把页面的结构和渲染分开来的时候,页面的脉络会变得很清晰。

  我们可以就事论事把这抽象的数据想象成,并构建成一棵树,所有对树结构的修改都在树的操作上完成,而所有对于节点内容的修改,在另一组数据上完成,这样能使页面的结构更为清晰,而且也便于检查和维护,不会存在定义了一堆变量,到最后,自己都忘了这个变量是用来干嘛的。

假设我们从后台获取到的数据是以数组的形式返回的,我们称这个数组为“原始数组”,“原始数组”中每一项代表一个节点的详细信息,那么具体操作可以分为以下步骤:

  1、构建树:创建一个“树”对象,把拿到的“原始数组”整理存入。“原始数组”每一项自动分配一个虚拟ID(从1开始,0作为最初的虚拟树根)作为键,键指向的值是一个至少包含 parentId(指向父节点),children数组(指向孩子节点,有顺序),nodeType(标示是或者不是叶子节点)的对象。

  2、构建卫星数据:创建一个“卫星数据”对象。以上一个步骤中的每一个虚拟ID为键,键指向的值是这个节点对应的所有详细真实的信息,如真实的ID,名字,内容,等等。

这样我们想要对树的结构进行修改时,只需要修改“树”对象,而我们需要修改节点信息的时候,只需要修改“卫星数据”,这样可以大大减少代码量,并且能对整个页面结构一目了然。

时间: 2024-10-06 13:53:43

如何构建逻辑清晰的可拖拽树的数据结构的相关文章

使用Dragablz快速构建Chrome样式的可拖拽分离的Tab页程序

今天发现了一个可以快速实现类似于Chrome方式的可拖拽分离的Tab页程序Dragablz.它可以实现动态创建,删除Tab页,并支持拖拽后形成独立窗口和窗口合并.   使用起来还是非常方便的. <dragablz:TabablzControl Margin="8"> <dragablz:TabablzControl.InterTabController> <dragablz:InterTabController /> </dragablz:Ta

【转】Nestable可拖拽树

原文地址:https://blog.csdn.net/wangmj518/article/details/81746523 Nestable是基于Bootstrap的一个可拖拽的树结构表现插件. 下面粗略的介绍一下它的用法,只作为学习参考,如有不合适之处,请各位凑合看. 下图是我在现在系统中用到的Nestable,对系统模块排序. 1.首先是需要引入的文件 bootstrap.min.css Bootstrap的CSS文件 font-awesome.min.css 这个是Bootstrap的一个

C#中实现控件拖拽效果(How to DragDrop Control in C#)

当产品间需要交互实现数据传递,或产品需要从外部导入文件时,通过控件拖拽来实现是个不错的选择.在UI上支持控件拖拽,可极大提升用户体验.拖拽本身并不神秘,它的本质实际是一个数据交换的过程.控件接受从其他地方来的数据,并进行处理.数据交换有多种方法,Windows中剪贴板可能就是用的最多,但最不被注意的一种方法.下面介绍用C#实现控件拖拽,并通过剪切板交换数据. 对于拖拽的对象,需要在MouseDown或ItemDrag中调用DoDragDrop,传递要拖拽的数据对象并触发拖拽.总的来说,当用户调用

Jquery实现可拖拽的树菜单

效果图如下所示:下载地址http://download.csdn.net/detail/javaquentin/8290417 <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&g

Android自定义控件:类QQ未读消息拖拽效果

QQ的未读消息,算是一个比较好玩的效果,趁着最近时间比较多,参考了网上的一些资料之后,本次实现一个仿照QQ未读消息的拖拽小红点,最终完成效果如下: 首先我们从最基本的原理开始分析,看一张图: 这个图该怎么绘制呢?实际上我们这里是先绘制两个圆,然后将两个圆的切点通过贝塞尔曲线连接起来就达到这个效果了.至于贝塞尔曲线的概念,这里就不多做解释了,百度一下就知道了. 切点怎么算呢,这里我们稍微复习一些初中的数学知识.看了这个图之后,求出四个切点应该是轻而易举了. 现在思路已经很清晰了,按照我们的思路,开

控件拖拽置换位置

简单的一个控件拖拽交换位置Demo,有些场景下会用到,关于此类功能网上有很多例子,而且Google官方API中也有相应的接口,对这种业务需求进行了一定逻辑封装.这里没有采用官方接口,单纯的从触摸事件入手来简单的实现控件位置交换. 写代码之前先理清楚实现的思路,这里从控件的触摸事件入手,触摸事件有ACTION_DOWN.ACTION_MOVE.ACTION_UP这几个状态,下面先把实现逻辑的思路写出来: 1.界面加载完成后用一个List记录各个子控件相对于父控件的坐标,同时将这些子控件放入一个Li

面向对象实战之封装拖拽对象

面向对象实战之封装拖拽对象 利用前面几章的所涉及到的知识,封装一个拖拽对象.为了能够帮助大家了解更多的方式与进行对比,我会使用三种不同的方式来实现拖拽. 不封装对象直接实现: 利用原生JavaScript封装拖拽对象: 通过扩展jQuery来实现拖拽对象. 本文的例子会放置于codepen.io中,供大家在阅读时直接查看.如果对于codepen不了解的同学,可以花点时间稍微了解一下. 拖拽的实现过程会涉及到非常多的实用小知识,因此为了巩固我自己的知识积累,也为了大家能够学到更多的知识,我会尽量详

基于Vue实现可以拖拽的树形表格实例详解

因业务需求,需要一个树形表格,并且支持拖拽排序,任意未知插入,github搜了下,真不到合适的,大部分树形表格都没有拖拽功能,所以决定自己实现一个.这里分享一下实现过程,项目源代码请看github,插件已打包封装好,发布到npm上 本博文会分为两部分,第一部分为使用方式,第二部分为实现方式 安装方式 npm i drag-tree-table --save-dev 使用方式 import dragTreeTable from 'drag-tree-table'  模版写法 ? 1 <dragTr

简单的鼠标拖拽效果(原生js实现)

之前在聊天群里看到有人说面试的时候被问到了怎样实现一个拖拽效果,当时看到后在心里默默思考了下,结果发现好像我也写不出来啊.本着遇到一个解决一个的思想,就亲自敲了一个,看到张鑫旭大神写的代码,真的很厉害,多多学习了,(感觉随便搜一个关于前端方面的问题都能看到他的网站,真是太佩服了,写了那么多文章,十分感谢.)好了,接下来就进入正题了.想实现一个效果首先得明白其中的逻辑,知道了实现逻辑后,就可以码代码了.首先我实现的效果是: 鼠标按下后,才可以执行后续效果 鼠标已经按下,然后鼠标移动,需要拖拽的元素