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 页面关闭前的出现提示的实现代码
May 25 Javascript
js判断登陆用户名及密码是否为空的简单实例
May 16 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
May 31 Javascript
jQuery获取与设置iframe高度的方法
Aug 01 Javascript
JavaScript实现垂直向上无缝滚动特效代码
Nov 23 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
vue通过watch对input做字数限定的方法
Jul 13 Javascript
记一次webpack3升级webpack4的踩坑经历
Jun 12 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
Nov 27 Javascript
vue给对象动态添加属性和值的实例
Sep 09 Javascript
原理深度解析Vue的响应式更新比React快
Apr 04 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
Mar 02 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中怎样防止SQL注入分析
2014/10/23 PHP
让焦点自动跳转
2006/07/01 Javascript
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python中垃圾回收和del语句详解
2018/11/15 Python
pandas 空数据处理方法详解
2019/11/02 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
vue实现倒计时功能
2021/03/24 Vue.js
毕业生求职推荐信
2013/11/04 职场文书
劳资专员岗位职责
2013/12/27 职场文书
大学生思想汇报范文
2013/12/31 职场文书
文明城市创建标语
2014/06/16 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python