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 相关文章推荐
推荐30个新鲜出炉的精美 jQuery 效果
Mar 26 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
基于JS实现EOS隐藏错误提示层代码
Apr 25 Javascript
详谈innerHTML innerText的使用和区别
Aug 18 Javascript
JS实现的按钮点击颜色切换功能示例
Oct 19 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 Javascript
Vue.js实现的表格增加删除demo示例
May 22 Javascript
通过封装scroll.js 获取滚动条的值
Jul 13 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
Nov 27 Javascript
vue基础之模板和过滤器用法实例分析
Mar 12 Javascript
JavaScript实现栈结构Stack过程详解
Mar 07 Javascript
vue.js实现双击放大预览功能
Jun 23 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
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
stripos函数知识点实例分享
2019/02/11 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
国王的演讲观后感
2015/06/03 职场文书
python实现自定义日志的具体方法
2021/05/28 Python
MySQL系列之二 多实例配置
2021/07/02 MySQL