vue实现多级菜单效果


Posted in Javascript onOctober 19, 2019

本次记录基于iview3框架实现多级菜单+vue router实现页面切换

方法一:

使用Tree 树形控件,官方文档

以官方demo为例,数据中添加URL属性,用于路由跳转,正式项目中该tree控件的数据由后端给出,需要注意的是后端给出的URL跳转地址最前一定要看清有没有"/" ,如果没有自己手动加或后端改,没有这个"/" 斜杠会导致路由跳转失败

思路:根据官方文档里面写用on-select-change事件返回当前已选中的节点数组、当前项,就利用返回的当前项数据拿到URL,并使用router跳转。

<template>
 <div class="layout">
 <Layout>
  <Header>
  <Menu mode="horizontal" theme="dark" active-name="1">
   <div class="layout-logo"></div>
   <div class="layout-nav">
   <MenuItem name="1">
    <Icon type="ios-navigate"></Icon>
    Item 1
   </MenuItem>
   <MenuItem name="2">
    <Icon type="ios-keypad"></Icon>
    Item 2
   </MenuItem>
   <MenuItem name="3">
    <Icon type="ios-analytics"></Icon>
    Item 3
   </MenuItem>
   <MenuItem name="4">
    <Icon type="ios-paper"></Icon>
    Item 4
   </MenuItem>
   </div>
  </Menu>
  </Header>
 </Layout>
 <Layout style="height: 100%;width: 100%;">
  <Sider hide-trigger breakpoint="md" width="200" :value=true>
   //方法一:使用Tree树控件,绑定点选事件
   <Tree :data="data1" @on-select-change="selectChange"></Tree>
   //方法二:使用menu导航菜单和递归
   <!--<SubItem :model="item" :sindex="index" v-for="(item,index) in data1" :key="index"></SubItem>-->
  </Sider>
  <Layout >
  <router-view></router-view>
  </Layout>
 
 </Layout>
 
 </div>
 
</template>
<script>
 import SubItem from './SubItemm.vue'
 export default {
  components:{
   SubItem
  },
  data () {
   return {
    data1: [
     {
      title: 'parent 1',
      expand: true,
      url:null,
      children: [
       {
        title: 'parent 1-1',
        url:null,
        children: [
         {
          title: 'leaf 1-1-1',
          url:'/chpo/chpo/chpoShow'
         },
         {
          title: 'leaf 1-1-2',
          url:'/chpo/chpoCollection/chpocollectionshow'
         }
        ]
       },
       {
        title: 'parent 1-2',
        url:null,
        children: [
         {
          title: 'leaf 1-2-1',
          url:'/company/course/courseshow'
         },
         {
          title: 'leaf 1-2-1',
          url:'/system/sysgamutgame/gamutgameshow'
         }
        ]
       }
      ]
     }
    ]
   }
  },
  methods:{
   selectChange(node,curr){
    //node 当前已选中的节点数组
    //curr 当前项,这里可是拿到当前项的数据,这样可以拿到跳转的URL
    if(curr.url)
    this.$router.push(curr.url)
   }
  }
 }
</script>

路由配置,这里子路由中的路径要和后端给出的路由地址保持一致,才能正确跳转

import Vue from 'vue'
import Router from 'vue-router'
import component1 from '@/components/component1'
import component2 from '@/components/component2'
import component3 from '@/components/component3'
import component4 from '@/components/component4'
import Index from '../view/Index'
 
Vue.use(Router)
 
export default new Router({
 routes: [
 {
  path: '/',
  name:'Index',
  component: Index,
  children:[
  {
   path: '/chpo/chpo/chpoShow',
   name:'component1',
   component: component1
  },
  {
   path: '/chpo/chpoCollection/chpocollectionshow',
   name:'component2',
   component: component2
  },
  {
   path: '/company/course/courseshow',
   name:'component3',
   component: component3
  },
  {
   path: '/system/sysgamutgame/gamutgameshow',
   name:'component4',
   component: component4
  },
  ]
 },
 
 ]
})

方法二:

使用Menu 导航菜单和递归来实现,组件官方文档

思路:①根据官方文档 MenuItem有 to target 属性,使用其一都能实现跳转,但跳转结果可能不一样,这里使用to属性跳转

②在子组件内进行是否为最终子项,若不是则使用递归进行再次循环,直到最终子项

子组件

<template>
 <Submenu :name="model.title" style="width: 200px">
 <template slot="title" style="width: 200px">
  {{model.title}}
 </template>
 // v-if判断是否为最终的子项,如果是则进行MenuItem渲染,否则进行递归调用
 <MenuItem :name="item.title" v-for="item in model.children" :to="item.url" v-if="!item.children || item.children.length==0" :key="item.index" style="width: 200px">{{item.title}}</MenuItem>
  //递归调用
 <SubItem :model="item" v-if="item.children&&item.children.length!==0" v-for="(item,index) in model.children" :key="index"></SubItem> 
 
 </Submenu>
</template>
 
<script>
 export default {
  name: "SubItem", //至关重要的一步,一定要写name,递归的时候使用
  props:['model'],
 }
</script>

在父组件中调用,使用v-for循环组件,传入当前item值即可,调用的代码已经在上面写过,不在赘述。

在MenuItem上绑定属性:to 跳转的router路径,即可实现页面切换。

最后截图展示效果:

方法一:使用tree树形组件效果

vue实现多级菜单效果

方法二:Menu组件和递归使用效果

vue实现多级菜单效果

至此,两种方法写完了,自己学习记录,仅供参考思路。

更多教程点击《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript concat数组累加 示例
Sep 03 Javascript
Javascript 面向对象特性
Dec 28 Javascript
JavaScript关于select的相关操作说明
Jan 13 Javascript
jQuery 源码分析笔记(4) Ready函数
Jun 02 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
artDialog双击会关闭对话框的修改过程分享
Aug 05 Javascript
Node.js中创建和管理外部进程详解
Aug 16 Javascript
js无提示关闭浏览器窗口的两种方法分析
Nov 06 Javascript
jQuery UI制作选项卡(tabs)
Dec 13 Javascript
vue-devtools的安装步骤
Apr 23 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
Mar 31 Javascript
vue.js实现三级菜单效果
Oct 19 #Javascript
vue.js实现只能输入数字的输入框
Oct 19 #Javascript
Vue数字输入框组件的使用方法
Oct 19 #Javascript
微信小程序实现禁止分享代码实例
Oct 19 #Javascript
Vue.js组件props数据验证实现详解
Oct 19 #Javascript
Vue.js组件使用props传递数据的方法
Oct 19 #Javascript
Vue.js数字输入框组件使用方法详解
Oct 19 #Javascript
You might like
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
深入理解javascript中defer的作用
2013/12/11 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
python中单下划线_的常见用法总结
2018/07/10 Python
python保存网页图片到本地的方法
2018/07/24 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
捷克玩具商店:Bambule
2019/02/23 全球购物
医学生自荐信范文
2013/12/03 职场文书
销售求职信范文
2014/05/26 职场文书
主题党日活动总结
2014/07/08 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
科技活动总结范文
2015/05/11 职场文书
驳回起诉裁定书
2015/05/19 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL