当前位置: 首页 > article >正文

Vue.js组件开发-实现多级菜单

在Vue.js中实现多级菜单(也称为嵌套菜单或分层菜单)涉及创建一个递归组件,该组件能够根据自身的数据结构(如数组或对象)动态地渲染菜单项及其子菜单。

示例:

展示如何实现一个多级菜单。

1. 数据结构

首先,需要定义一个数据结构来表示菜单项及其子菜单。这可以是一个数组,其中每个元素代表一个菜单项,并且可能包含一个children数组来表示其子菜单。

const menuData = [
  {
    name: '菜单1',
    children: [
      { name: '子菜单1-1' },
      { name: '子菜单1-2' },
      {
        name: '子菜单1-3',
        children: [
          { name: '子子菜单1-3-1' },
          { name: '子子菜单1-3-2' }
        ]
      }
    ]
  },
  {
    name: '菜单2',
    children: [
      { name: '子菜单2-1' },
      { name: '子菜单2-2' }
    ]
  }
];

2. 创建递归组件

接下来,需要创建一个递归组件,该组件能够接收一个菜单项(可能包含子菜单)并渲染它。

<template>
  <li>
    {{ item.name }}
    <ul v-if="item.children && item.children.length">
      <MenuItem v-for="(child, index) in item.children" :key="index" :item="child" />
    </ul>
  </li>
</template>

<script>
export default {
  name: 'MenuItem',
  props: {
    item: {
      type: Object,
      required: true
    }
  }
};
</script>

<style scoped>
/* 样式可以根据需要进行调整 */
ul {
  list-style-type: none;
  padding-left: 20px;
}
</style>

3. 使用递归组件

现在可以在主组件中使用这个递归组件,并将整个菜单数据传递给它。

<template>
  <div>
    <ul>
      <MenuItem v-for="(item, index) in menuData" :key="index" :item="item" />
    </ul>
  </div>
</template>

<script>
import MenuItem from './MenuItem.vue';
import menuData from './menuData.js'; // 假设菜单数据在一个单独的文件中

export default {
  components: {
    MenuItem
  },
  data() {
    return {
      menuData
    };
  }
};
</script>

<style scoped>
/* 样式可以根据需要进行调整 */
</style>

4. 说明


‌数据结构‌:menuData是一个包含菜单项及其子菜单的数组。每个菜单项都是一个对象,可能有一个name属性和一个children数组。
‌递归组件‌:MenuItem组件接收一个item属性,该属性包含当前菜单项的数据。如果菜单项有子菜单(即item.children存在且长度大于0),则递归地渲染这些子菜单。
‌使用递归组件‌:在主组件中,使用v-for指令遍历menuData数组,并为每个菜单项创建一个MenuItem组件实例。

实现一个多级(嵌套)菜单,它根据menuData的数据结构动态地渲染出来。


http://www.kler.cn/a/461113.html

相关文章:

  • MySQL 05 章——排序与分页
  • Couchbase 和数据湖技术的区别、联系和相关性分析
  • Leetcode打卡:我的日程安排表II
  • 计算机网络 (16)数字链路层的几个共同问题
  • flutter 专题二十四 Flutter 响应式状态管理框架GetX
  • 直观解读 JuiceFS 的数据和元数据设计(一)
  • want php学习笔记
  • 【mysql】linux安装mysql客户端
  • 计算机体系结构期末考试
  • PDF怎么压缩得又小又清晰?5种PDF压缩方法
  • WPF合并C1FlexGrid表格,根据多列的值进行合并
  • JavaWeb开发(二)IDEA创建Java Web项目并部署及目录结构
  • Applied Spatial Statistics(十三)带有空间平滑器的 GAM
  • 批量新建工作表,带个性化模板一步到位-Excel易用宝
  • 12.29~12.31[net][review]need to recite[part 2]
  • 电脑主机后置音频插孔无声?还得Realtek高清晰音频管理器调教
  • 【题解】AT_abc386_d AtCoder Beginner Contest 386 D Diagonal Separation
  • 【每日学点鸿蒙知识】List+Swipe滑动冲突、下拉刷新、编译错误定位、监听生命周期、上架应用市场要求
  • 分布饼状图——开发解释——未来之窗行业应用跨平台架构
  • 零售小程序怎么自己搭建?开个小卖铺如何留住客户?
  • mybatisPlus基础
  • 服务器数据恢复—磁盘阵列中多块硬盘离线导致存储中数据无法访问的数据恢复
  • SpringMVC中的拦截器
  • MVC 架构学习笔记
  • CUTLASS:高性能 CUDA 线性代数模板库详解
  • 过圆外一点与圆相切的直线