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>
相关推荐
TttHhhYy3 分钟前
小记,antd design vue的下拉选择框,选项部分不跟着滑动走,固定在屏幕某个部位,来改
前端·vue.js·sql
小二·4 分钟前
Python Web 全栈开发实战教程:基于 Flask 与 Layui 的待办事项系统
前端·python·flask
光影少年5 分钟前
vite为什么速度快?
前端·学习
boooooooom8 分钟前
Vue3 宏编译的限制与解决方案:深入理解与实践突破
vue.js
万物得其道者成13 分钟前
用 Python + MySQL + Web 打造我的私有 Apple 设备监控面板
前端·python·mysql
Hi_kenyon23 分钟前
快速入门VUE与JS(二)--getter函数(取值器)与setter(存值器)
前端·javascript·vue.js
海云前端127 分钟前
前端面试加分技巧:文本省略 + Tooltip 优雅实现,附可直接复用代码(求职党必看)
前端
3秒一个大27 分钟前
模块化 CSS:解决样式污染的前端工程化方案
css·vue.js·react.js
在西安放羊的牛油果27 分钟前
浅谈 storeToRefs
前端·typescript·vuex
triumph_passion28 分钟前
Zustand 从入门到精通:我的工程实践笔记
前端·性能优化