
Security News
Meet Socket at Black Hat and DEF CON 2025 in Las Vegas
Meet Socket at Black Hat & DEF CON 2025 for 1:1s, insider security talks at Allegiant Stadium, and a private dinner with top minds in software supply chain security.
vue-tree-list2
Advanced tools
A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.
A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.
Editable is fixed. not drag in editable.
if want hide icons
Install the plugin then you can use the component globally.
import Vue from 'vue'
import VueTreeList from 'vue-tree-list2'
Vue.use(VueTreeList)
Or just register locally like the example below.
npm install vue-tree-list2
<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="addTreeNodeIcon">📂</span>
<span class="icon" slot="addLeafNodeIcon">+</span>
<span class="icon" slot="editNodeIcon">📃</span>
<span class="icon" slot="delNodeIcon">✂️</span>
<span class="icon" slot="leafNodeIcon">🍃</span>
<template v-slot:treeNodeIcon="slotProps">
<div class="icon pl-4 pr-2" v-if="slotProps.model.children && slotProps.model.children.length > 0">
//no extended icon
<vs-icon icon="keyboard_arrow_right" class="icon-style" v-if="!slotProps.expanded"/>
//extended icon
<vs-icon icon="keyboard_arrow_down" class="icon-style" v-if="slotProps.expanded"/>
</div>
//no child icon
<vs-icon v-else icon="fiber_manual_record" class="icon-style"/>
</template>
</vue-tree-list>
</vue-tree-list>
<button @click="getNewTree">Get new tree</button>
<pre>
{{newTree}}
</pre>
</div>
</template>
<script>
import { VueTreeList, Tree, TreeNode } from 'vue-tree-list2'
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, toogle) {
console.log(params)
//if want toogle node status
//toogle();
},
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)
}
}
}
</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 |
hide-add-leaf-icon | boolean | false | Hide add leaf icon |
hide-add-node-icon | boolean | false | Hide add node icon |
hide-delete-icon | boolean | false | Hide delete node icon |
hide-edit-icon | boolean | false | Hide edit node icon |
always-show-icon | boolean | false | cancel show hover (always show) |
show-child-icon | boolean | true | do active and passive childe icon |
add-manuel-node | boolean | false | use "add-child-leaf" or "add-child-tree" event for add leaf or tree |
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 changing a node's name |
changed-name | {'id', 'newName'} | Complate 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, src, target} | Trigger after dropping a node into another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop into |
drop-before | {node, src, target} | Trigger after dropping a node before another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop before |
drop-after | {node, src, target} | Trigger after dropping a node after another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop after |
add-child-leaf | Function(name,options), addModel | if add-manuel-node is true, this event triger for add leaf. Example in page down |
add-child-tree | Function(name,options), addModel | if add-manuel-node is true, this event triger for add tree node. Example in page down |
The component has default icons for addTreeNodeIcon
, addLeafNodeIcon
, editNodeIcon
, delNodeIcon
, leafNodeIcon
, treeNodeIcon
button, but you can also customize them and can access model
, root
, expanded
as below:
<template v-slot:addTreeNodeIcon="slotProps">
<span class="icon">📂</span>
</template>
<template v-slot:addLeafNodeIcon="slotProps">
<span class="icon">+</span>
</template>
<template v-slot:editNodeIcon="slotProps">
<span class="icon">📃</span>
</template>
<template v-slot:delNodeIcon="slotProps">
<span class="icon">✂️</span>
</template>
<template v-slot:leafNodeIcon="slotProps">
<span class="icon">🍃</span>
</template>
<template v-slot:treeNodeIcon="slotProps">
<span class="icon">
{{ (slotProps.model.children && slotProps.model.children.length > 0 && !slotProps.expanded) ?
'🌲' : '' }}</span
>
</template>
#add-child-leaf and add-child-tree event Example
<vue-tree-list :add-manuel-node="true" @add-child-tree="addManuelTreeNode">
<template v-slot:addTreeNodeIcon="slotProps">
<span class="icon">📂</span>
</template>
<template v-slot:addLeafNodeIcon="slotProps">
<span class="icon">+</span>
</template>
<template v-slot:editNodeIcon="slotProps">
<span class="icon">📃</span>
</template>
<template v-slot:delNodeIcon="slotProps">
<span class="icon">✂️</span>
</template>
<template v-slot:leafNodeIcon="slotProps">
<span class="icon">🍃</span>
</template>
<template v-slot:treeNodeIcon="slotProps">
<span class="icon">
{{ slotProps.model.children && slotProps.model.children.length > 0 && !slotProps.expanded ?
'🌲' : '' }}</span
>
</template>
</vue-tree-list>
methods:
addManuelTreeNode(addMethod,clickModel)
{
//learn current data info with "this.data"
addMethod('Test Node name', {
dragDisabled: false,
addTreeNodeDisabled: false,
addLeafNodeDisabled: false,
editNodeDisabled: false,
delNodeDisabled: false,
id: '123123'
})
}
FAQs
A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.
The npm package vue-tree-list2 receives a total of 1 weekly downloads. As such, vue-tree-list2 popularity was classified as not popular.
We found that vue-tree-list2 demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Meet Socket at Black Hat & DEF CON 2025 for 1:1s, insider security talks at Allegiant Stadium, and a private dinner with top minds in software supply chain security.
Security News
CAI is a new open source AI framework that automates penetration testing tasks like scanning and exploitation up to 3,600× faster than humans.
Security News
Deno 2.4 brings back bundling, improves dependency updates and telemetry, and makes the runtime more practical for real-world JavaScript projects.