vue3 组件递归组件

1. 什么是组件递归

通俗的讲 :
组件导入自己本身
②一般 根据 children或是 是否有下一层的属性去判断是否结束。

2.以 Tree 树形菜单为例

在这里插入图片描述

3.代码实现

① Tree.vue 代码:

参数=>解释
onoff() 函数1.通过判断是否在id是否在closeList数组里, 有就删除,没有就添加。
2.在每个标签通过 v-if 判断该id 是否在closeList里 实现显示隐藏
props参数=>
Arr (传入的菜单数据)
index(索引:不用传入,默认为1,根据其大小判断没层向右的偏移量)

代码:

<template>
  <div style="width: 200px">
    <div v-for="item in Arr">
      	<p :style="{ marginLeft: (index - 1) * 10 + 'px'}">
            //判断是否展开
        	<span @click="onoff(item.id)" v-if="item.children">
          		{{ closeList.includes(item.id) ? "➧" : "⏷" }}
        	</span>
        	//内容
        	{{ item.text }}
        
      	</p>
      	//根据传入的值判断 是否需要在递归
        <tree-list
           v-if="item.children && !closeList.includes(item.id)"
          :Arr="item.children"
          :index="index"
          :key="item.id"
        />
    </div>
  </div>
</template>
<script>
import { reactive, toRefs, ref } from "vue";
export default {
  name: "tree-list",
  props: {
       Arr: { type: Array },
       index: { type: Number }
  },
  setup(props) {
    let index = props.index ? props.index : 0;
    index += 1;
    
    const closeList = reactive([]);
    function onoff(id) {
      if (closeList.includes(id)) {
        closeList.splice(closeList.indexOf(id));
      } else {
        closeList.push(id);
      }
    }

    return { ...toRefs(props), closeList, onoff, index};
  },
};
</script>

使用 xxx.vue 使用该组件

<template>
  <tree-list :Arr="Arr" />
</template>
<script>
import treeList from "./Tree.vue";
export default {
  components:{ Tree  },
  setup() {
    const Arr = [
      { id: "1", text: "菜单1", children: [
          {
            id: "2", text: "菜单1-1",children: [
                  {id: "3",  text: "菜单1-1-1"},
                  {id: "3",  text: "菜单1-1-2"}
                ],
          },
        ],
      },
      { id: "2",text: "菜单2"}
    ];
    return {  Arr };
  },
};
</script>

没有这么写样式哦,由精通CSS的小伙伴来完善把!

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生切图仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值