A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.
Live Demo
npm install vue-tree-list
< template >
< div >
< button @click = "addNode" > Add Node</ button >
< vue-tree-list
@click = "onClick"
@change-name = "onChangeName"
@delete - node = "onDel"
@add-node = "onAddNode"
:model = "data"
default-tree-node-name = "new node"
default-leaf-node-name = "new leaf"
v-bind :default-expanded = "false" >
< span class = "icon" slot = "addTreeNode" > addTreeNode</ span >
< span class = "icon" slot = "addLeafNode" > addLeafNode</ span >
< span class = "icon" slot = "editNode" > editNode</ span >
< span class = "icon" slot = "delNode" > delNode</ span >
</ vue-tree-list >
< button @click = "getNewTree" > Get new tree</ button >
< pre >
{ { newTree} }
</ pre >
</ div >
</ template >
< script >
import { VueTreeList, Tree, TreeNode } from 'vue-tree-list'
export default {
components : {
VueTreeList
} ,
data ( ) {
return {
newTree : { } ,
data : new Tree ( [
{
name : 'Node 1' ,
id : 1 ,
pid : 0 ,
dragDisabled : true ,
addTreeNodeDisabled : true ,
addLeafNodeDisabled : true ,
editNodeDisabled : true ,
delNodeDisabled : true ,
children : [
{
name : 'Node 1-2' ,
id : 2 ,
isLeaf : true ,
pid : 1
}
]
} ,
{
name : 'Node 2' ,
id : 3 ,
pid : 0 ,
disabled : true
} ,
{
name : 'Node 3' ,
id : 4 ,
pid : 0
}
] )
}
} ,
methods : {
onDel ( node ) {
console . log ( node )
node . remove ( )
} ,
onChangeName ( params ) {
console . log ( params )
} ,
onAddNode ( params ) {
console . log ( params )
} ,
onClick ( params ) {
console . log ( params )
} ,
addNode ( ) {
var node = new TreeNode ( { name : 'new node' , isLeaf : false } )
if ( ! this . data . children ) this . data . children = [ ]
this . data . addChildren ( node )
} ,
getNewTree ( ) {
var vm = this
function _dfs ( oldNode ) {
var newNode = { }
for ( var k in oldNode ) {
if ( k !== 'children' && k !== 'parent' ) {
newNode [ k ] = oldNode [ k ]
}
}
if ( oldNode . children && oldNode . children . length > 0 ) {
newNode . children = [ ]
for ( var i = 0 , len = oldNode . children . length ; i < len ; i ++ ) {
newNode . children . push ( _dfs ( oldNode . children [ i ] ) )
}
}
return newNode
}
vm . newTree = _dfs ( vm . data )
} ,
onClick ( model ) {
console . log ( model )
}
}
}
< / script>
< style lang = "less" rel = "stylesheet/less" >
.vtl {
. vtl - drag - disabled {
background - color : #d0cfcf;
& :hover {
background - color : #d0cfcf;
}
}
. vtl - disabled {
background - color : #d0cfcf;
}
}
</ style >
< style lang = "less" rel = "stylesheet/less" scoped >
. icon {
& :hover {
cursor : pointer ;
}
}
</style >
name
type
default
description
model
TreeNode
-
You can use const head = new Tree([])
to generate a tree with the head of TreeNode
type
default-tree-node-name
string
New node node
Default name for new treenode
default-leaf-node-name
string
New leaf node
Default name for new leafnode
default-expanded
boolean
true
Tree is expanded or not
name
type
default
description
id
string, number
current timestamp
The node's id
isLeaf
boolean
false
The node is leaf or not
dragDisabled
boolean
false
Forbid dragging tree node
addTreeNodeDisabled
boolean
false
Show addTreeNode
button or not
addLeafNodeDisabled
boolean
false
Show addLeafNode
button or not
editNodeDisabled
boolean
false
Show editNode
button or not
delNodeDisabled
boolean
false
Show delNode
button or not
children
array
null
The children of node
name
params
description
changeName
name
Change node's name
addChildren
children: object, array
Add children to node
remove
-
Remove node from the tree
moveInto
target: TreeNode
Move node into another node
insertBefore
target: TreeNode
Move node before another node
insertAfter
target: TreeNode
Move node after another node
name
params
description
click
TreeNode
Trigger when clicking a tree node
change-name
{'id', 'oldName', 'newName'}
Trigger after changing a node's name
delete-node
TreeNode
Trigger when clicking delNode
button. You can call remove
of TreeNode
to remove the node.
add-node
TreeNode
Trigger after adding a new node
drop
{'node', 'oldParent'}
Trigger after dropping a node into another
drop-up
{'node', 'oldParent'}
Trigger after extracting a node from another
customize operation icons
The component has default icons for addTreeNode
, addLeafNode
, editNode
, delNode
button, but you can also customize them:
< span class ="icon " slot ="addTreeNode "> addTreeNode</ span >
< span class ="icon " slot ="addLeafNode "> addLeafNode</ span >
< span class ="icon " slot ="editNode "> editNode</ span >
< span class ="icon " slot ="delNode "> delNode</ span >