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 源代码显示控件 (Ajax加载方式).
May 18 Javascript
新发现一个骗链接的方法(js读取cookies)
Jan 11 Javascript
了解Javascript的模块化开发
Mar 02 Javascript
JavaScript中的Math.atan2()方法使用详解
Jun 15 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
Jul 08 Javascript
AngularJS 实现JavaScript 动画效果详解
Sep 08 Javascript
mac上配置Android环境变量的方法
Jul 08 Javascript
实例分析vue循环列表动态数据的处理方法
Sep 28 Javascript
微信小程序实现商城倒计时
Nov 01 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
Aug 05 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数组函数array_key_exists()小结
2015/12/10 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
再论Javascript的类继承
2011/03/05 Javascript
nodejs教程之入门
2014/11/21 NodeJs
jQuery实现多按钮单击变色
2014/11/27 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
原生JS轮播图插件
2017/02/09 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
js获取ip和地区
2017/03/10 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
Python计算三角函数之asin()方法的使用
2015/05/15 Python
在centos7中分布式部署pyspider
2017/05/03 Python
PyQt5实现简易电子词典
2019/06/25 Python
wxpython布局的实现方法
2019/11/01 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
校园活动策划书范文
2014/01/10 职场文书
教师校本培训方案
2014/02/26 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫