Vue 递归多级菜单的实例代码


Posted in Javascript onMay 05, 2019

考虑以下菜单数据:

[
 {
 name: "About",
 path: "/about",
 children: [
  {
  name: "About US",
  path: "/about/us"
  },
  {
  name: "About Comp",
  path: "/about/company",
  children: [
   {
   name: "About Comp A",
   path: "/about/company/A",
   children: [
    {
    name: "About Comp A 1",
    path: "/about/company/A/1"
    }
   ]
   }
  ]
  }
 ]
 },
 {
 name: "Link",
 path: "/link"
 }
];

需要实现的效果:

 Vue 递归多级菜单的实例代码

首先创建两个组件 Menu 和 MenuItem

// Menuitem

<template>
 <li class="item">
 <slot />
 </li>
</template>

MenuItem 是一个 li 标签和 slot 插槽,允许往里头加入各种元素

<!-- Menu -->

<template>
 <ul class="wrapper">
 <!-- 遍历 router 菜单数据 -->
 <menuitem :key="index" v-for="(item, index) in router">
  <!-- 对于没有 children 子菜单的 item -->
  <span class="item-title" v-if="!item.children">{{item.name}}</span>

  <!-- 对于有 children 子菜单的 item -->
  <template v-else>
  <span @click="handleToggleShow">{{item.name}}</span>
  <!-- 递归操作 -->
  <menu :router="item.children" v-if="toggleShow"></menu>
  </template>
 </menuitem>
 </ul>
</template>

<script>
 import MenuItem from "./MenuItem";

 export default {
 name: "Menu",
 props: ["router"], // Menu 组件接受一个 router 作为菜单数据
 components: { MenuItem },
 data() {
  return {
  toggleShow: false // toggle 状态
  };
 },
 methods: {
  handleToggleShow() {
  // 处理 toggle 状态的是否展开子菜单 handler
  this.toggleShow = !this.toggleShow;
  }
 }
 };
</script>

Menu 组件外层是一个 ul 标签,内部是 vFor 遍历生成的 MenuItem

这里有两种情况需要做判断,一种是 item 没有 children 属性,直接在 MenuItem 的插槽加入一个 span 元素渲染 item 的 title 即可;另一种是包含了 children 属性的 item 这种情况下,不仅需要渲染 title 还需要再次引入 Menu 做递归操作,将 item.children 作为路由传入到 router prop

最后在项目中使用:

<template>
 <div class="home">
 <menu :router="router"></menu>
 </div>
</template>

<script>
 import Menu from '@/components/Menu.vue'

 export default {
 name: 'home',
 components: {
  Menu
 },
 data () {
  return {
  router: // ... 省略菜单数据
  }
 }
 }
</script>

最后增加一些样式:

MenuItem:

<style lang="stylus" scoped>
 .item {
 margin: 10px 0;
 padding: 0 10px;
 border-radius: 4px;
 list-style: none;
 background: skyblue;
 color: #fff;
 }
</style>

Menu:

<style lang="stylus" scoped>
 .wrapper {
 cursor: pointer;

 .item-title {
  font-size: 16px;
 }
 }
</style>

Menu 中 ul 标签内的代码可以单独提取出来,Menu 作为 wrapper 使用,递归操作部分的代码也可以单独提取出来

总结

以上所述是小编给大家介绍的Vue 递归多级菜单的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery实现控制表格行高亮实例
Jun 05 Javascript
Javascript 遮罩层和加载效果代码
Aug 01 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
Jul 18 Javascript
setinterval()与clearInterval()JS函数的调用方法
Jan 21 Javascript
Node.js和MongoDB实现简单日志分析系统
Apr 25 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
Oct 09 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
Apr 29 Javascript
微信小程序  Mustache语法详细介绍
Oct 27 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
Jan 13 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
May 05 #Javascript
详解Vue调用手机相机和相册以及上传
May 05 #Javascript
原生JS实现动态添加新元素、删除元素方法
May 05 #Javascript
Angular实现svg和png图片下载实现
May 05 #Javascript
jQuery动态生成的元素绑定事件操作实例分析
May 04 #jQuery
node Buffer缓存区常见操作示例
May 04 #Javascript
JS实现checkbox互斥(单选)功能示例
May 04 #Javascript
You might like
php中计算时间差的几种方法
2009/12/31 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
Javascript MD4
2006/12/20 Javascript
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
Python输出各行命令详解
2018/02/01 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
python-numpy-指数分布实例详解
2019/12/07 Python
基于python plotly交互式图表大全
2019/12/07 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
护士自我鉴定范文
2013/10/06 职场文书
2014组织生活会方案
2014/05/19 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
Python+Appium实现自动抢微信红包
2021/05/21 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript