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>
相关推荐
IT_陈寒8 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
小徐_23338 小时前
uni-app 项目别再从零搭了!3 个 Wot UI 起手模板怎么选?
前端·uni-app
张元清8 小时前
React useResizeObserver Hook:追踪元素尺寸变化(2026)
javascript·react.js
赵庆明老师9 小时前
Vben精讲:16-熟悉Vite前端工具链
前端
瑞瑞小同学11 小时前
处理echarts x轴内容过多,重叠问题
前端·javascript·echarts
HexCIer11 小时前
面向未来的原子化 CSS:UnoCSS 核心架构分析与 Tailwind CSS 现状
前端·css·vite
程序员黑豆11 小时前
鸿蒙应用开发中的单位详解:px、vp、fp、lpx
前端·harmonyos
像我这样帅的人丶你还12 小时前
MCP + npm:给五年前的老系统接上AI
前端·javascript·agent
南一Nanyi12 小时前
依赖注入和控制反转
前端·设计模式·nestjs
小村儿12 小时前
连载14-实战篇--一个半月,我一个人和 Claude Code 搭出一套数字人工程
前端·后端·ai编程