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 相关文章推荐
Node.js开发指南中的简单实例(mysql版)
Sep 17 Javascript
推荐9款炫酷的基于jquery的页面特效
Dec 07 Javascript
js实现图片和链接文字同步切换特效的方法
Feb 20 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
Mar 10 Javascript
jquery控制显示服务器生成的图片流
Aug 04 Javascript
概述VUE2.0不可忽视的很多变化
Sep 25 Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
使用vue-resource进行数据交互的实例
Sep 02 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 Javascript
JavaScript 类的封装操作示例详解
May 16 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
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语法(2)
2006/10/09 PHP
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
在vue中使用console.log无效的解决
2020/08/09 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Python正则表达式完全指南
2017/05/25 Python
详解Python中的动态属性和特性
2018/04/07 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
python-numpy-指数分布实例详解
2019/12/07 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
Python求解排列中的逆序数个数实例
2020/05/03 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
python实例化对象的具体方法
2020/06/17 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
请说出几个常用的异常类
2013/01/08 面试题
linux系统都有哪些运行级别
2012/04/15 面试题
《山谷中的谜底》教学反思
2014/04/26 职场文书
2014年信用社工作总结
2014/11/25 职场文书
个人总结怎么写
2015/02/26 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python