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>
相关推荐
暴富的Tdy2 小时前
【使用 Vue2 脚手架创建项目并实现主题切换功能涵盖Ant-Design-Vue2/Element-UI】
vue.js·elementui·anti-design-vue·vue切换主题
LYFlied2 小时前
【每日算法】LeetCode 79. 单词搜索
前端·算法·leetcode·面试·职场和发展
如果你好2 小时前
🔥 手撕call/apply/bind:从ES6用法到手写实现,吃透this指向核心
前端·javascript
大佬桑2 小时前
Talend API Tester 接口测试插件 Google Chrome 浏览器的轻量级 API 测试插件
前端·chrome
阿西谈科技2 小时前
利用 AI 写前端:从辅助编码到智能化开发的完整实践指南
前端
爱喝麻油的小哆2 小时前
前端html导出pdf,(不完美)解决文字被切割的BUG,记录一下
前端
@大迁世界2 小时前
React 以惨痛的方式重新吸取了 25 年前 RCE 的一个教训
前端·javascript·react.js·前端框架·ecmascript
小蹦跶儿2 小时前
Vue项目中字体引入:完整实操指南
vue.js·字体·视觉设计
晴殇i2 小时前
【拿来就用】Uniapp路由守卫终极方案:1个文件搞定全站权限控制,老板看了都点赞!
前端·javascript·面试