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 相关文章推荐
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
Nov 26 Javascript
jquery中ajax学习笔记一
Oct 16 Javascript
jQuery中bind与live的用法及区别小结
Jan 27 Javascript
原生js结合html5制作简易的双色子游戏
Mar 30 Javascript
jQuery切换所有复选框选中状态的方法
Jul 02 Javascript
js实现仿爱微网两级导航菜单效果代码
Aug 31 Javascript
JS实现完全语义化的网页选项卡效果代码
Sep 15 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
May 18 Javascript
JS中检测数据类型的几种方式及优缺点小结
Dec 12 Javascript
详谈构造函数加括号与不加括号的区别
Oct 26 Javascript
react.js组件实现拖拽复制和可排序的示例代码
Aug 20 Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 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 飞信好友免费短信API接口开源版
2010/07/22 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
php格式文件打开的四种方法
2018/02/24 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
node使用request请求的方法
2019/12/20 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
Python探索之自定义实现线程池
2017/10/27 Python
numpy自动生成数组详解
2017/12/15 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
物业管理求职自荐信
2013/09/25 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
银行办理业务介绍信
2014/01/18 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
大班上学期个人总结
2015/02/13 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
音乐研修感悟
2015/11/18 职场文书