vue中实现tree
Vue 中实现 Tree 组件
在 Vue 中实现 Tree 组件可以通过递归组件或第三方库完成。以下是两种常见方法:
递归组件实现
递归组件是 Vue 中实现 Tree 结构的常见方式,通过组件调用自身实现层级嵌套。
<template>
<ul>
<li v-for="item in treeData" :key="item.id">
{{ item.label }}
<tree-node v-if="item.children" :treeData="item.children"></tree-node>
</li>
</ul>
</template>
<script>
export default {
name: 'TreeNode',
props: {
treeData: {
type: Array,
required: true
}
}
}
</script>
使用时传入树形结构数据:
<template>
<tree-node :treeData="treeData"></tree-node>
</template>
<script>
import TreeNode from './TreeNode.vue'
export default {
components: { TreeNode },
data() {
return {
treeData: [
{
id: 1,
label: '节点1',
children: [
{ id: 2, label: '子节点1' },
{ id: 3, label: '子节点2' }
]
}
]
}
}
}
</script>
使用第三方库
对于更复杂的需求,可以使用成熟的 Tree 组件库:
- Element UI Tree
适用于 Element UI 项目:
<template>
<el-tree :data="treeData" :props="defaultProps"></el-tree>
</template>
<script>
export default {
data() {
return {
treeData: [{
label: '一级节点',
children: [{
label: '二级节点'
}]
}],
defaultProps: {
children: 'children',
label: 'label'
}
}
}
}
</script>
- Vue Draggable Tree
需要拖拽功能时可使用:
npm install vue-draggable-tree
<template>
<vue-draggable-tree :data="treeData" />
</template>
<script>
import VueDraggableTree from 'vue-draggable-tree'
export default {
components: { VueDraggableTree },
data() {
return {
treeData: [
{ title: '节点1', children: [
{ title: '子节点1' }
]}
]
}
}
}
</script>
自定义功能扩展
对于自定义 Tree 组件,通常需要实现以下功能:
- 节点展开/折叠
通过v-if或v-show控制子节点显示:
<li v-for="item in treeData" :key="item.id">
<span @click="item.expanded = !item.expanded">
{{ item.expanded ? '−' : '+' }} {{ item.label }}
</span>
<ul v-if="item.expanded && item.children">
<tree-node :treeData="item.children"></tree-node>
</ul>
</li>
- 节点选择
添加选中状态管理:
methods: {
toggleSelect(item) {
this.$set(item, 'selected', !item.selected)
}
}
- 异步加载
通过事件触发异步数据加载:
async loadChildren(item) {
const res = await api.getChildren(item.id)
this.$set(item, 'children', res.data)
}
性能优化建议
对于大型树结构,可采用虚拟滚动优化:
npm install vue-virtual-scroll-tree
<virtual-scroll-tree
:data="largeTreeData"
:item-size="30"
height="500px"
/>
以上方法可根据项目需求选择,简单场景推荐递归组件,复杂场景建议使用成熟库。







