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 相关文章推荐
JQery 渐变图片导航效果代码 漂亮
Jan 01 Javascript
jQuery MD5加密实现代码
Mar 15 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
Apr 19 Javascript
js实现页面转发功能示例代码
Aug 05 Javascript
js确认删除对话框效果的示例代码
Feb 20 Javascript
浅谈javascript的Array.prototype.slice.call
Aug 31 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
Nov 02 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
Aug 11 Javascript
js判断传入时间和当前时间大小实例(超简单)
Jan 11 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
pm2启动ssr失败的解决方法
Jun 29 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
Nov 01 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/08/11 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
PHP最常用的正则表达式
2017/02/13 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
Python模块文件结构代码详解
2018/02/03 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
python如何进入交互模式
2020/07/06 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
大学生实习感言
2014/01/16 职场文书
服务员岗位职责
2014/01/29 职场文书
集中整治工作方案
2014/05/01 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
心理健康教育主题班会
2015/08/13 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
简单聊聊Golang中defer预计算参数
2022/03/25 Golang
我的收音机情缘
2022/04/05 无线电