vue递归组件

一、前言

在我们开发过程中,为了提高开发效率,降低开发难度,我们会直接使用组件库来实现,同时也衍生出了很多优秀的组件库,如:饿了么、蚂蚁、Iview、vant等等。但是有时这些组件库提供给我们的组件不满足我们的需求或者定制组件时成本太高,那么我们就要手动实现了。 

二、递归组件是什么?

字面理解为层层递进最后归并到一起,它的特点就是层级分明。
例如饿了么组件库的树组件就是一个递归。

 

 

三、Vue实现递归的核心思路

1、循环出一级类别
2、判断如果有多级,再调用自身。

四、代码示例

1.父级

  1 <template>
  2   <div>
  3     <Child v-bind="{ list }"/>
  4   </div>
  5 </template>
  6 
  7 <script>
  8 import Child from './child.vue'
  9 export default {
 10   components: { Child },
 11   data() {
 12     return {
 13       list: [
 14         {
 15           name: '11',
 16           children: [
 17             {
 18               name: '11-1',
 19               children: [
 20                 {
 21                   name: '11-1-1',
 22                   children: [
 23                     {
 24                       name: '11-1-1-1'
 25                     }
 26 
 27                   ]
 28                 }
 29 
 30               ]
 31             },
 32             {
 33               name: '11-2'
 34             },
 35             {
 36               name: '11-3'
 37             }
 38           ]
 39         },
 40         {
 41           name: '22',
 42           children: [
 43             {
 44               name: '22-1',
 45               children: [
 46                 {
 47                   name: '22-1-1',
 48                   children: [
 49                     {
 50                       name: '22-1-1-1'
 51                     }
 52 
 53                   ]
 54                 }
 55 
 56               ]
 57             },
 58             {
 59               name: '22-2'
 60             },
 61             {
 62               name: '22-3'
 63             }
 64           ]
 65         },
 66         {
 67           name: '33',
 68           children: [
 69             {
 70               name: '33-1',
 71               children: [
 72                 {
 73                   name: '33-1-1',
 74                   children: [
 75                     {
 76                       name: '33-1-1-1'
 77                     }
 78 
 79                   ]
 80                 }
 81 
 82               ]
 83             },
 84             {
 85               name: '33-2'
 86             },
 87             {
 88               name: '33-3'
 89             }
 90           ]
 91         },
 92         {
 93           name: '44-3'
 94         },
 95         {
 96           name: '55-3'
 97         },
 98         {
 99           name: '66-3'
100         }
101       ]
102     }
103   }
104 }
105 </script>

2.子级

 1 <template>
 2   <div>
 3     <div v-for="item in list" :key="item.name">
 4       <p>{{ item.name }}</p>
 5       <!-- 核心代码1 -->
 6       <div v-if="item.children" style="padding-left: 20px">
 7           <!-- 核心代码2 -->
 8           <ChildCom :list="item.children" />
 9       </div>
10     </div>
11   </div>
12 </template>
13 
14 <script>
15 export default {
16   name: 'ChildCom',
17   props: ['list']
18 }
19 </script>

3.效果

  

五、总结

很简单的一个demo,重点是我们是否了解Vue每个组件定义的name的真正用途是什么。每个组件的name值其实也是为了帮助我们实现递归的。

代码逻辑也很简单,重点在我的子组件。但父组件传过来的树形数据结构到子组件后,我们需要拿到数据并做遍历,然后再下一行加入核心逻辑:if 发现我们有子数据,那么我们直接调用自身组件,也就是直接使用name值做组件声明。最关键的是要把子数据结构再传入我们自身组件,那么我们就成功的实现了数据的层层遍历。

当然,这块儿的子数据结构字段我这里叫chirden,一般企业开发是后台给我们的,他们也可以叫A,叫B,我们需要根据自己的数据字段情况,去做相应的修改。

posted @ 2023-01-29 00:40  强者之途  阅读(131)  评论(0编辑  收藏  举报
/* 看板娘 */