vue递归实现树
Vue 递归实现树形结构
使用 Vue 递归组件可以高效实现树形结构展示。递归组件通过组件自身调用自身的方式处理嵌套数据。
基础实现
定义树形组件时,组件内部可以调用自身。确保设置 name 选项以便递归。
<template>
<ul>
<li v-for="node in treeData" :key="node.id">
{{ node.name }}
<tree-node v-if="node.children" :treeData="node.children"></tree-node>
</li>
</ul>
</template>
<script>
export default {
name: 'TreeNode',
props: {
treeData: {
type: Array,
required: true
}
}
}
</script>
数据格式要求
树形数据需要符合特定结构,通常每个节点包含 children 数组表示子节点。
const treeData = [
{
id: 1,
name: '节点1',
children: [
{
id: 2,
name: '子节点1'
}
]
}
]
动态加载优化
对于大型树结构,可以实现动态加载子节点以减少初始渲染压力。
<template>
<ul>
<li v-for="node in treeData" :key="node.id">
<span @click="loadChildren(node)">
{{ node.name }}
</span>
<tree-node
v-if="node.children && node.expanded"
:treeData="node.children">
</tree-node>
</li>
</ul>
</template>
<script>
export default {
methods: {
loadChildren(node) {
if (!node.children) {
// 异步加载子节点逻辑
}
node.expanded = !node.expanded
}
}
}
</script>
样式优化
为不同层级添加缩进样式增强可读性。

ul {
padding-left: 20px;
}
li {
list-style-type: none;
cursor: pointer;
}
性能考虑
- 为每个节点设置唯一的
key - 对于大型树结构考虑虚拟滚动
- 避免在模板中使用复杂表达式
完整示例
<template>
<div class="tree-container">
<tree-node :treeData="treeData"></tree-node>
</div>
</template>
<script>
import TreeNode from './TreeNode.vue'
export default {
components: { TreeNode },
data() {
return {
treeData: [
{
id: 1,
name: '根节点',
expanded: true,
children: [
{
id: 2,
name: '子节点1'
}
]
}
]
}
}
}
</script>
通过以上方法可以实现灵活可扩展的树形组件,根据实际需求调整数据结构和交互逻辑即可满足不同场景需求。






