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 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
javascript:void(0)的作用示例介绍
Oct 28 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
详解Angualr 组件间通信
Jan 21 Javascript
原生js实现放大镜特效
Mar 08 Javascript
jQuery简单绑定单个事件的方法示例
Jun 10 jQuery
vue如何获取点击事件源的方法
Aug 10 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
Sep 30 Javascript
javascript验证form表单数据的案例详解
Mar 25 Javascript
微信小程序云开发实现增删改查功能
May 17 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
javascript中数组array及string的方法总结
2014/11/28 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
Python实现提取文章摘要的方法
2015/04/21 Python
Python实现字典依据value排序
2016/02/24 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
了解一下python内建模块collections
2020/09/07 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
深入探究HTML5的History API
2015/07/09 HTML / CSS
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
网络教育自我鉴定
2014/02/04 职场文书
2015年党员自评材料
2014/12/17 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
党员转正意见怎么写
2015/06/03 职场文书
股权投资协议书
2016/03/23 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript