vue实现递归
Vue 实现递归组件的方法
在 Vue 中实现递归通常用于处理树形结构数据(如菜单、评论、文件目录等)。以下是两种常见的实现方式:
通过组件名称递归
定义组件时通过 name 属性实现自调用:
<template>
<div>
<div>{{ node.label }}</div>
<template v-if="node.children">
<tree-node
v-for="child in node.children"
:key="child.id"
:node="child"
/>
</template>
</div>
</template>
<script>
export default {
name: 'TreeNode', // 关键点:通过name实现自调用
props: {
node: Object
}
}
</script>
通过动态组件递归
使用 component 标签实现动态递归:
<template>
<div>
<div>{{ data.title }}</div>
<component
v-if="data.children"
:is="compName"
v-for="item in data.children"
:key="item.id"
:data="item"
/>
</div>
</template>
<script>
export default {
props: ['data'],
computed: {
compName() {
return this.$options.name // 获取当前组件名
}
}
}
</script>
递归注意事项
- 终止条件:必须设置递归终止条件(如
v-if="node.children"),否则会导致无限循环 - 性能优化:对于深层级数据建议添加
v-if和v-show控制渲染 - key 属性:循环时必须提供唯一的
key值 - 作用域样式:建议使用
scoped样式避免样式污染
递归组件示例(文件目录结构)
<template>
<ul>
<li v-for="item in list" :key="item.name">
{{ item.name }}
<file-tree v-if="item.children" :list="item.children"/>
</li>
</ul>
</template>
<script>
export default {
name: 'FileTree',
props: {
list: Array
}
}
</script>
使用方式:
<file-tree :list="treeData"/>
递归数据处理技巧
对于后端返回的扁平数据,可先转换为树形结构:

function buildTree(items, id = null) {
return items
.filter(item => item.parentId === id)
.map(item => ({
...item,
children: buildTree(items, item.id)
}))
}






