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 相关文章推荐
20款效果非常棒的 jQuery 插件小结分享
Nov 18 Javascript
javascript仿qq界面的折叠菜单实现代码
Dec 12 Javascript
自定义百度分享的分享按钮
Mar 18 Javascript
Bootstrap零基础入门教程(三)
Jul 18 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
Javascript 调用 ActionScript 的简单方法
Sep 22 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
Vue中父组件向子组件通信的方法
Jul 11 Javascript
seajs中最常用的7个功能、配置示例
Oct 10 Javascript
php中and 和 &amp;&amp;出坑指南
Jul 13 Javascript
微信小程序基于Taro的分享图片功能实践详解
Jul 12 Javascript
8个JS的reduce使用实例和reduce操作方式
Oct 05 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发送get、post请求的6种方法简明总结
2014/07/08 PHP
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
python 求10个数的平均数实例
2019/12/16 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
python request 模块详细介绍
2020/11/10 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
django使用多个数据库的方法实例
2021/03/04 Python
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
公司授权委托书
2014/10/17 职场文书
2014年教育工作总结
2014/11/26 职场文书
感恩教育观后感
2015/06/17 职场文书
2016公司年会主持词
2015/07/01 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
幼儿园教师辞职信
2019/06/21 职场文书