vue实现组织树
Vue 实现组织树的方法
使用递归组件实现组织树
递归组件是 Vue 中实现树形结构的常见方法。通过组件调用自身,可以动态渲染多层嵌套的组织结构。
<template>
<div>
<tree-node :node="treeData"></tree-node>
</div>
</template>
<script>
import TreeNode from './TreeNode.vue'
export default {
components: { TreeNode },
data() {
return {
treeData: {
name: 'Root',
children: [
{
name: 'Child 1',
children: [
{ name: 'Grandchild 1' },
{ name: 'Grandchild 2' }
]
},
{
name: 'Child 2'
}
]
}
}
}
}
</script>
<!-- TreeNode.vue -->
<template>
<div>
<div>{{ node.name }}</div>
<tree-node
v-for="child in node.children"
:key="child.name"
:node="child"
v-if="node.children"
></tree-node>
</div>
</template>
<script>
export default {
name: 'TreeNode',
props: {
node: Object
}
}
</script>
使用第三方库实现组织树
Vue生态中有多个成熟的树形组件库,可以快速实现复杂功能:
- Vue-Tree-Chart:轻量级树形图表组件
npm install vue-tree-chart
<template>
<tree-chart :json="treeData"></tree-chart>
</template>
<script>
import TreeChart from 'vue-tree-chart'
export default {
components: { TreeChart },
data() {
return {
treeData: {
name: 'Root',
children: [
{ name: 'Child 1' },
{ name: 'Child 2' }
]
}
}
}
}
</script>
- Vuejs-Tree:功能丰富的树形组件
npm install vuejs-tree
实现组织树的交互功能
完整的组织树通常需要支持展开/折叠、选中、拖拽等功能:
<template>
<div>
<div @click="toggleChildren">{{ node.name }}</div>
<div v-show="isExpanded">
<tree-node
v-for="child in node.children"
:key="child.id"
:node="child"
v-if="node.children"
></tree-node>
</div>
</div>
</template>
<script>
export default {
name: 'TreeNode',
props: {
node: Object
},
data() {
return {
isExpanded: false
}
},
methods: {
toggleChildren() {
this.isExpanded = !this.isExpanded
}
}
}
</script>
优化组织树性能
对于大型组织树,可以使用虚拟滚动优化性能:
npm install vue-virtual-scroll-list
<template>
<virtual-list
:size="50"
:remain="10"
:data="flattenedTree"
>
<tree-node
v-for="item in flattenedTree"
:key="item.id"
:node="item"
></tree-node>
</virtual-list>
</template>
组织树的数据处理
通常需要将扁平数据转换为树形结构:
function buildTree(flatData) {
const map = {}
const roots = []
flatData.forEach(item => {
map[item.id] = { ...item, children: [] }
})
flatData.forEach(item => {
if (item.parentId) {
map[item.parentId].children.push(map[item.id])
} else {
roots.push(map[item.id])
}
})
return roots
}






