Omi框架能够以少量的代码声明式地编写可拖拽移动节点的树形组件。
通常树组件能够考验UI框架的健壮性,因为需要使用到UI框架的如下特性:
下面来介绍下使用 omi-tree 的开发全过程。你也可以无视文章,先体验一把和直接编辑源码试一把:
omi-tree playground
类划分树的数据规则:
[ [ [] [] } ] [ [] [] } ] [ [] [] } ] } ] }
可以看到,每个节点都有唯一的id来标识,每个节点也有children属性来存放自己的子节点的信息。
组件HTML结构tree结构:
group
这里需要特别注意的是:
tree-node结构:
ondragstartondropdiv datanamenode
可以看到每个tree-node都标记了draggable代表可以拖拽,drag和drop的支持情况大家可以caniuse一把。
先看tree:
(id(.getChildById(parentId, this.data.children) .data.children) parent.children.push(child) this.update() (parentId.getChildById(childId, this.data.children), children (len i < len; i++) { let child = children[i] errorIds .id ) (idlen i < len; i++) { let child = children[i] .splice(i, 1) return child .removeChildById(id, child.children) if (target) { return target (idlen i < len; i++) { let child = children[i] child .getChildById(id, child.children) if (target) { return target () .tag('tree', Tree)
下面来看 tree-node:
(evt) .getRootInstance(this.parent).moveNode(parseInt(evt.dataTransfer.getData("node-id")), parseInt(evt.target.dataset['nodeId'])) .node.classList.remove('drag-over') evt.stopPropagation() evt.preventDefault() (parent.moveNode){ return parent .getRootInstance(parent.parent) (evt){ this.node.classList.add('drag-over') evt.stopPropagation() evt.preventDefault() .node.classList.remove('drag-over') ..data.id) evt.stopPropagation() ()().tag('tree-node',TreeNode)
到此位置,复杂的拖拽移动都完成了。增删改查就更加简单了,大家可以接着试试~~~
Omi相关