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 相关文章推荐
jQuery 中使用JSON的实现代码
Dec 01 Javascript
下载文件个别浏览器文件名乱码解决办法
Mar 19 Javascript
js跑步算法的实现代码
Dec 04 Javascript
javascript数组排序汇总
Jul 07 Javascript
js仿腾讯QQ的web登陆界面
Aug 19 Javascript
JS判断一个数是否是水仙花数
Jun 11 Javascript
JS实现简易换图时钟功能分析
Jan 04 Javascript
vue项目中使用ueditor的实例讲解
Mar 05 Javascript
Vue 源码分析之 Observer实现过程
Mar 29 Javascript
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
Aug 07 Javascript
jquery实现直播视频弹幕效果
Feb 25 jQuery
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 filter_var() 函数 Filter 函数
2012/04/25 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
Vue中key的作用示例代码详解
2020/06/10 Javascript
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
英文求职信结束语大全
2013/10/26 职场文书
母亲追悼会答谢词
2014/01/27 职场文书
我的祖国演讲稿
2014/05/04 职场文书
公积金具结保证书
2015/05/11 职场文书
SqlServer 垂直分表(减少程序改动)
2021/04/16 SQL Server
Python中glob库实现文件名的匹配
2021/06/18 Python
python Django框架快速入门教程(后台管理)
2021/07/21 Python