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 相关文章推荐
innerHTML 和 getElementsByName 在IE下面的bug 的解决
Apr 09 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
显示今天的日期js代码(阳历和农历)
Sep 30 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
使用Angular.js实现简单的购物车功能
Nov 21 Javascript
div实现自适应高度的textarea实现angular双向绑定
Jan 08 Javascript
bootstrap paginator分页前后台用法示例
Jun 17 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
vue中$nextTick的用法讲解
Jan 17 Javascript
vue中typescript装饰器的使用方法超实用教程
Jun 17 Javascript
webpack4 optimization使用总结
Nov 10 Javascript
JavaScript数组排序的六种常见算法总结
Aug 18 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
phpinfo的知识点总结
2019/10/10 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
Python实现的堆排序算法示例
2018/04/29 Python
对pandas中Series的map函数详解
2018/07/25 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
python实现简单多人聊天室
2018/12/11 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python中的面向接口编程示例详解
2021/01/17 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
2015年服务员工作总结
2015/04/08 职场文书