- Notifications
You must be signed in to change notification settings - Fork61
Vue2 draggable tree component
License
phphe/vue-draggable-nested-tree
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This project is no longer maintained, please move to the new monorepohe-tree.
本项目不再维护, 请移步到新的 monorepohe-tree.
这是可拖拽树组件. 此组件没有 css, 您需要自己添加您喜欢的样式, 参考 demo, 只有几个样式, 不难.此组件不负责节点的具体渲染, 暴露了一个节点渲染插槽, 请参考 demo 自行渲染.
This is a draggable tree component. This component does not have css, you need to add your style refer to demo. The demo style is less, not difficult.This component doesn't render node. It exposes a node rendering slot. Please refer to the demo for rendering.
已支持简单触摸(单点).
Support touch(single point).
npm i vue-draggable-nested-tree
import{DraggableTree}from"vue-draggable-nested-tree";// vue-draggable-nested-tree contains Tree, TreeNode, DraggableTree, DraggableTreeNode// import the component and register it as global or local component
data:[{text:"node 1"},{text:"node 2"},{text:"node 3 undraggable",draggable:false},{text:"node 4"},{text:"node 4 undroppable",droppable:false},{text:"node 5",children:[{text:"node 1"},{text:"node 2",children:[{text:"node 3"},{text:"node 4"}]},{text:"node 2 undroppable",droppable:false,children:[{text:"node 3"},{text:"node 4"}],},{text:"node 2",children:[{text:"node 3"},{text:"node 4 undroppable",droppable:false},],},{text:"node 3"},{text:"node 4"},{text:"node 3"},{text:"node 4"},{text:"node 3"},{text:"node 4"},{text:"node 3"},{text:"node 4"},],},];
Tree(:data="data"draggablecrossTree) div(slot-scope="{data, store, vm}") //- data is node //- store is the tree //- vm is node Vue instance, you can get node level by vm.level template(v-if="!data.isDragPlaceHolder") b(v-if="data.children && data.children.length"@click="store.toggleOpen(data)") {{data.open ? '-' : '+'}} span {{data.text}}
//- slot-scope="{data, store, vm}" may not work in old browsers, replace with slot-scope="slot"Tree(:data="data"draggablecrossTree) div(slot-scope="slot") //- data is node //- store is the tree //- vm is node Vue instance, you can get node level by vm.level template(v-if="!slot.data.isDragPlaceHolder") b(v-if="slot.data.children && slot.data.children.length"@click="slot.store.toggleOpen(slot.data)") {{slot.data.open ? '-' : '+'}} span {{slot.data.text}}
// base treedata:{},// type Arrayindent:{default:16},activatedClass:{default:'active'},openedClass:{default:'open'},space:{default:10},// space between node, unit px// draggable treepreventSelect:{default:true},// if to prevent drag handler text be selected when drag, excluding input and textareagetTriggerEl:{type:Function},// get the el trigger drag, default is node self. arguments(nodeVm)draggable:{},// is the tree draggable, default falsedroppable:{default:true},// is the tree droppable, default truecrossTree:{},// can a node of the tree be dragged into other tree, or receive other tree node
ondragstart:{type:Function},// hook. return false to prevent drag. arguments(node, draggableHelperInfo)ondragend:{type:Function},// hook. return false to prevent drop. arguments(node, draggableHelperInfo)
// baserootData,// generated by tree// draggabledplh,// drag placeholder. globally unique.trees,// array, all trees in the app. globally unique.
// store is the tree vmdrag(node),// on drag start.drop(node,targetTree,oldTree),// after drop.change(node,targetTree,oldTree),// after drop, only when the node position changednodeOpenChanged(node);// on a node is closed or open
- targetTree and oldTree are tree vm.
- oldTree is available only when cross tree. Otherwise null.
- if cross tree, both targetTree and oldTree will emit drop and change.
pure(node,withChildren,after)/*purereturn a node data without runtime properties.(!: property which starts with '_' will be removed)withChildren: optional. after: Function, optionalthe code about after(t is computed node data):if (after) { return after(t, node) || t}return t*/getNodeById(id)getActivated()getOpened()activeNode(node,inactiveOld)toggleActive(node,inactiveOld)openNode(node,closeOld)toggleOpen(node,closeOld)// follow methods are easy, so I paste their soure codegetPureData(after){returnthis.pure(this.rootData,true,after).children}// after: Function, optionaldeleteNode(node){returnhp.arrayRemove(node.parent.children,node)}// add node: like array. eg: node.children.push(newNodeData)// update node: just assign to the node properties directlyisNodeDraggable(node)isNodeDroppable(node)
// base_id_vmparentchildren:[],open,active:false,style:{},class:'',innerStyle:{},innerClass:'',innerBackStyle:{},innerBackClass:{},// draggabledraggable// default true. Please check 'draggable & droppable' belowdroppable// default true. Please check 'draggable & droppable' belowisDragPlaceHolder
node._vm;// vmnode._vm.level;// 节点层级, 只读node._vm.store;// treenode.parent._vm;// parent node vmnode._vm.store;
.he-tree {border:1px solid#ccc;padding:20px;width:300px;}.tree-node {}.tree-node-inner {padding:5px;border:1px solid#ccc;cursor: pointer;}.draggable-placeholder {}.draggable-placeholder-inner {border:1px dashed#0088f8;box-sizing: border-box;background:rgba(0,136,249,0.09);color:#0088f9;text-align: center;padding:0;display: flex;align-items: center;}
clone the package, and
npm installnpm run dev
A node is default draggable and droppable. You can set draggable and droppable property of a node. The another way is listen event 'drag', traverse all data to set draggable or droppable property.
Recommend to use my other librarytree-helper. It has 2 traverse methods: depthFirstSearch, breadthFirstSearch.
draggable-helper is my another library for drag. And it also is using by this component. You can use it to help you drag functions.
About
Vue2 draggable tree component
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.