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 相关文章推荐
JavaScript 继承详解(二)
Jul 13 Javascript
JQuery 学习笔记 选择器之五
Jul 23 Javascript
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
基于jquery的3d效果实现代码
Mar 23 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
Dec 29 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
Jul 05 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
Nov 08 jQuery
小程序实现发表评论功能
Jul 06 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
JavaScript单线程和任务队列原理解析
Feb 04 Javascript
JavaScript运行机制实例分析
Apr 11 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
python中from module import * 的一个坑
2014/07/20 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
python中的时区问题
2021/01/14 Python
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
搬家公司的创业计划书
2014/01/01 职场文书
护士毕业生自荐信
2014/02/07 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
八项规定对照检查材料
2014/08/31 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
2015年售票员工作总结
2015/04/29 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
目标责任书格式范文
2015/05/11 职场文书
老兵退伍感言
2015/08/03 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python