vue实现tree拖拽
Vue 实现 Tree 拖拽功能
使用 vue-draggable 库
vue-draggable 是基于 Sortable.js 的 Vue 拖拽组件库,适合实现树形结构的拖拽功能。
安装依赖:
npm install vuedraggable
基础实现代码:
<template>
<draggable
v-model="treeData"
group="nodes"
@end="onDragEnd">
<div v-for="(item, index) in treeData" :key="item.id">
{{ item.name }}
<tree-node
v-if="item.children"
:nodes="item.children"/>
</div>
</draggable>
</template>
<script>
import draggable from 'vuedraggable'
export default {
components: { draggable },
props: ['nodes'],
data() {
return {
treeData: this.nodes
}
},
methods: {
onDragEnd(evt) {
console.log('拖拽完成', evt)
}
}
}
</script>
使用 Element UI 的 Tree 组件
Element UI 提供了现成的可拖拽树形组件。
安装 Element UI:
npm install element-ui
示例代码:
<template>
<el-tree
:data="treeData"
draggable
@node-drop="handleDrop"
node-key="id">
</el-tree>
</template>
<script>
export default {
data() {
return {
treeData: [{
id: 1,
label: '一级节点',
children: [{
id: 4,
label: '二级节点'
}]
}]
}
},
methods: {
handleDrop(draggingNode, dropNode, type) {
console.log('拖拽处理', draggingNode, dropNode, type)
}
}
}
</script>
自定义实现拖拽功能
对于需要高度自定义的场景,可以直接使用 HTML5 的拖拽 API。
基础实现思路:
<template>
<div
v-for="node in nodes"
:key="node.id"
draggable
@dragstart="dragStart(node)"
@dragover.prevent
@drop="drop(node)">
{{ node.name }}
<tree-node
v-if="node.children"
:nodes="node.children"
@node-dropped="handleDrop"/>
</div>
</template>
<script>
export default {
props: ['nodes'],
data() {
return {
draggedNode: null
}
},
methods: {
dragStart(node) {
this.draggedNode = node
},
drop(targetNode) {
this.$emit('node-dropped', {
dragged: this.draggedNode,
target: targetNode
})
}
}
}
</script>
注意事项
- 树形数据结构需要包含唯一标识字段(如 id)
- 拖拽时需要处理父子节点的层级关系
- 移动节点后需要更新整个树的数据结构
- 复杂场景可能需要递归处理节点关系
性能优化建议
- 对于大型树结构,使用虚拟滚动
- 避免在拖拽过程中频繁触发重渲染
- 可以考虑使用扁平化数据结构优化性能







