欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

前端开发树形插件带来的烦恼(一)

程序员文章站 2022-03-26 21:52:46
liuyuhang原创,未经允许请勿转载! 前端开发树形插件带来的烦恼(一) 前端开发中,有些项目中会用到树形插件,其数据结构也比较简单,大体如下: 数据结构说明: 每一行代表一个数据,该数据由基本信息,id,pid三个部分构成。pid为连接的父节点,额外增加的内容也包括两个部分; ①缩进;②节点展 ......

liuyuhang原创,未经允许请勿转载!

前端开发树形插件带来的烦恼(一)

前端开发中,有些项目中会用到树形插件,其数据结构也比较简单,大体如下:

 1 treeroot
 2 
 3   |-- tree01  id = 01  pid = 0
 4     |-- leaf01  id = 04  pid = 01
 5     |-- leaf02  id = 05  pid = 01
 6     |-- leaf03  id = 06  pid = 01
 7     ......
 8   |-- tree02  id = 02  pid = 0
 9     |-- leaf04  id = 07  pid = 02
10     ......
11   |-- tree03  id = 03  pid = 0
12     |-- leaf05  id = 08  pid = 03
13     ......
14   ......

数据结构说明:

  每一行代表一个数据,该数据由基本信息,id,pid三个部分构成。pid为连接的父节点,额外增加的内容也包括两个部分;

  ①缩进;②节点展开提示,如+ - 符号,> < 符号等,方式众多,不是重点,不继续说了。

树形结构展示说明:

  树形结构的展示方式主要还是通过遍历和递归,渲染方式可以一次性将数组组装好整体展示,或者一层层展示,也可以考虑一共展示几层(递归次数)

 

烦恼不在于此,烦恼是来自于业务的。我举例两个树形结构,暂命名为树形结构a和树形结构b,描述如下: 1 树形结构a 2

 3 科:大猫科          id = 1  pid = 0   
 5   属:虎          id = 2  pid = 1
 7     种:01华南虎     id = 3  pid = 2
 8       02孟加拉虎    id = 4  pid = 2
 9       03东北虎     id = 5  pid = 2
10 
11  - - - - -- - - - - - - - - - - -
12 树形结构b
13 14 键盘:键盘实例        id = 1  pid = 0 16   按键:q键        id = 2  pid = 1 18     :w键        id = 3  pid = 1   19     :e键        id = 4  pid = 1

在以上两个例子中,假设我需要在每个节点(包括根节点)上做个复选框,然后拿到所选择的 id,之后根据已选择的id进行操作。

这里对于节点是否已选,我见到的操作方式是不同的。如:

01、选择根节点,子节点跟随显示选择;

02、选择根节点,子节点不跟随显示选择;

03、选择所有子节点,根节点跟随显示选择;

04、选择部分子节点,根节点跟随显示选择;

05、选择部分子节点,根节点跟随显示半选择;

05、选择部分子节点,根节点跟随显示不选择;

  首先以01、03、04这种策略对上述两种ab树结构进行分析

    对a进行假设,已选择 01华南虎,此时 属:虎 对应跟随显示选择,

    因为  下只有这么一个 ,所以 科:大猫 必定跟随显示选择;

    至此,对树形结构a选择的 id列表为 [ 1,2 ,3 ];

      此时我可以说:“华南虎是虎,华南虎是大猫”,这两种描述都并没有任何错误。

      ——即符合事实,也符合选择复选策略出现的id列表

    对b进行假设,已选择 q键 ,此时键盘实例跟随显示选择;

    至此,对树形结构b选择的 id列表为[ 1, 2 ];

      此时我说:“我按q键,键盘灯点亮的是q键”,就是错的,因为我按q键,选择的是q;

      但是实际选择的是q和整个键盘,所以点亮的键盘灯也是整个键盘的,

      这个看似很简单的问题源于树形结构中的选择附带的 id 跟随选择策略的不同;

  同理,假设我以01、03、05这种策略对以上两种ab树结构进行分析,一样会得出矛盾的结论,还是上例:

    对a结构描述:可以说:“华南虎是虎,但是虎不是华南虎,范围不同”,这句话是正确的,也符合逻辑

    对b结构描述:可以说:“我按q键,并没有按全部的键盘按键,键盘灯点亮的只有q键”

      以上两种说法都符合逻辑,也很正确,但是id如何选,假设去掉父 id,则一条符合半选描述,

      一条符合不选描述的内容,半选到底是选,还是不选?

      拿出来的数据结构是否有必要重新列一张列表出来,很是矛盾,即使是使用01、03、06,依然也会产生困惑。

    这两个例子还算好,还有更恶心的例子:

      假设父节点是空的内容,比如某页ppt,有文字a,文字b,图形c,图形d,其中ab编组为x,cd编组为y,xy编组为z;

      这个树形结构的父节点是架空的,内容完全由最基层的子节点来构成的情况下,

      我选择a的时候,必定跟随选择ab形成的组x,必定跟随选择x所属的编组xy构成的z;

      试问,此时我要对a沿虚线剪下,剪下的是谁,如果不拆分组,剪掉的是z,

      实际上是abcd,如果拆分组,那破坏了本身的树形结构;

      若此时我选择z,然后对z沿虚线剪下,剪下的应该是整个组,但是这个组之间可能会有间距,有重叠,

      并没有分开树形结构,实际上选择的是z,但是获取的id并非是abcd的id,也不是xy的id,只获取了z的id;

      这种选择了父节点而子节点并未实际跟随选择的情况如何计算呢?

    所以,树形结构的复选策略,实际上是复杂的,在给用户的设计中,是必定要有跟随选择的;

    至少带有全选,反选,子节点全选父节点跟随全选,子节点未全选父节点要么半选,要么不选这种跟随性操作;

 

    十几种一种策略不够用,上述描述的策略也只是适用于某种情况而已;

    如果树形结构编组的是3d模型组?2d图层组?真实分类的子分类?策略不能一蹴而就的;

 

    既然已经使用了树结构,而且又要必须使用多选,那么树形结构就必须分开策略,分别创建,复用性就大大降低;

    而已经做好的很多树形结构的插件大神们,有考虑以上这些问题,提供出不同复选策略的方案么?

 

后续会慢慢更新这个问题,有一些尚未全部完成的解决思路,有空就更一下!

以上!✧(∗≧ꇴ≦)人(≧ꈊ≦∗)✧