12.17 vue递归组件

recursion 递归

使用递归组件可以方便地在组件内部递归地渲染子节点。例如,可以使用一个名为 tree-node 的组件,该组件在其模板中递归地包含自身,并在每一层次上显示节点的标签和其子节点。这样,当数据发生变化时,组件会自动重新渲染,并保持节点层次结构的正确性。

![[850X850.PNG]]

多级菜单数据

data.js

JSON 复制代码
const data = [
    {
        id: 1,
        title: '汉堡店',
        cont: [
            {

                id: 2,
                title: '小吃系列',
                cont: [
                    { id: 3, title: '轰炸大鱿鱼'},
                    { id: 4, title: '香酥鸡柳'},
                    { id: 5, title: '脆皮土豆'}
                ]
            },
            {

                id: 6,
                title: '汉堡系列',
                cont: [
                    { id: 7, title: '深海鳕鱼堡'},
                    { id: 8, title: '香辣鸡腿堡'},
                    { id: 9, title: '劲脆鸡腿堡'}
                ]
            },
            {

                id: 10,
                title: '饮品系列',
                cont: [
                    { id: 11, title: '可口可乐'},
                    { id: 12, title: '雪碧'},
                    { id: 13, title: '冰淇淋'}
                ]
            }
        ]
    },
    {
        id: 11,
        title: '牛排店',
        cont: [
            {

                id: 12,
                title: '牛排系列',
                cont: [
                    { id: 13, title: '黑椒牛排'},
                    { id: 14, title: '西冷牛排'},
                    { id: 15, title: '菲力牛排'}
                ]
            },
            {

                id: 16,
                title: '咖啡系列',
                cont: [
                    { id: 17, title: '卡布奇诺'},
                    { id: 18, title: '摩卡'}
                ]
            },
            {

                id: 20,
                title: '沙拉系列',
                cont: [
                    { id: 21, title: '水果沙拉'},
                    { id: 22, title: '鸡胸肉沙拉'},
                    { id: 23, title: '牛排沙拉'}
                ]
            }
        ]
    },
    {
        id: 31,
        title: '红酒店',
        cont: [
            {

                id: 32,
                title: '国产葡萄酒系列',
                cont: [
                    { id: 33, title: '长城红标'},
                    { id: 34, title: '张裕二星'},
                    { id: 35, title: '王朝干红'}
                ]
            },
            {

                id: 36,
                title: '进口葡萄酒系列',
                cont: [
                    { id: 37, title: '法国都夏'},
                    { id: 38, title: '拉菲庄园'},
                    { id: 39, title: '卡斯特.巴蒂'}
                ]
            },
            {

                id: 40,
                title: '洋酒系列',
                cont: [
                    { id: 41, title: '杰克丹尼'},
                    { id: 42, title: '人头马部落'},
                    { id: 43, title: '轩尼诗VSOP'}
                ]
            }
        ]
    }
]
export default data

递归****组件定义

Vue3

递归****组件的父组件

HTML 复制代码
<script setup>
    import foodMenu from './foodMenu.vue';
    import menuData from './data.js'
</script>
<template>
   <div class="recursion">
       <h3>递归组件的父组件</h3>
       <foodMenu :menu-data="menuData"></foodMenu>
   </div>
</template>
<style lang="scss" scoped>
</style>

递归****组件

HTML 复制代码
<script setup>
defineProps({
    menuData: Array
})
</script>
<template>
    <ul>
        <li v-for="menu in menuData" :key="menu.id">
            <p>---{{ menu.title }}</p>
            <food-menu :menu-data="menu.cont"></food-menu>
        </li>
    </ul>
</template>
<style lang="scss" scoped></style>

Vue2

递归****组件的父组件

HTML 复制代码
<template>
  <div id="app">
    <food-menu :menu-data="menuData"></food-menu>
  </div>
</template>
<script>
import menuData from "./data";
import foodMenu from './FoodMenu.vue'
export default {
  data(){
    return {
      menuData: menuData
    }
  },
  components: {
    foodMenu
  }
};
</script>
<style lang="scss">
</style>

递归****组件

foodMenu.vue

递归组件的技术要点: 一定要设置name属性,递归使用时,用得就是name属性的值

HTML 复制代码
<template>
  <ul>
    <li v-for="menu in menuData" :key="menu.id">
      <p>---{{ menu.title }}</p>
      <food-menu :menu-data="menu.cont"></food-menu>
      <!--
          等价于:
          <ul>
              <li>
                  <p></p>
                  <ul>
                      <li>
                          <p></p>
                      </li>
                  </ul>
              </li>
          </ul>
       -->

    </li>
  </ul>
</template>
<script>
export default {
  // 组件的name属性有三种用法
  // 1. <keep-alive include="组件的name"></keep-alive>
  // 2. vue devtools 显示组件的name
  // 3. 递归组件
  name: "foodMenu",
  props: ["menuData"],
  data() {
    return {};
  },
};
</script>
<style>
</style>
相关推荐
Novlan12 分钟前
@tdesign/uniapp 图标瘦身
前端
ManThink Technology5 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
铅笔侠_小龙虾19 分钟前
Flutter 实战: 计算器
开发语言·javascript·flutter
大模型玩家七七38 分钟前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
. . . . .1 小时前
shadcn组件库
前端
2501_944711431 小时前
JS 对象遍历全解析
开发语言·前端·javascript
发现一只大呆瓜1 小时前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
css趣多多2 小时前
ctx 上下文对象控制新增 / 编辑表单显示隐藏的逻辑
前端
阔皮大师2 小时前
INote轻量文本编辑器
java·javascript·python·c#
lbb 小魔仙2 小时前
【HarmonyOS实战】React Native 表单实战:自定义 useReactHookForm 高性能验证
javascript·react native·react.js