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 相关文章推荐
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
Jun 02 Javascript
jQuery动态添加的元素绑定事件处理函数代码
Aug 02 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
理解javascript中的原型和原型链
Jul 30 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
Aug 17 Javascript
js跨域请求数据的3种常用的方法
Dec 01 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
JS实现HTML页面中动态显示当前时间完整示例
Jul 30 Javascript
vue-cli3 karma单元测试的实现
Jan 18 Javascript
JS实现可用滑块滑动的缓动图代码
Sep 01 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
Aug 13 Javascript
在antd中setFieldsValue和defaultVal的用法
Oct 29 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
最省空间的计数器
2006/10/09 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
销售简历自我评价
2014/01/24 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
《长征》教学反思
2014/04/27 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
遗嘱范文
2015/08/07 职场文书
贷款担保书范本
2015/09/22 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
Python matplotlib多个子图绘制整合
2022/04/13 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers