iview菜单(Menu)和选项卡(Tabs)的组合应用

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 03:46:54

前提

本人学习iview阶段,组合应用的前提要掌握vue,vue-router等基础,本次项目利用的是router-link和router-view进行的操作,才可实现。

最后成果

最后的出的成果
相对于一些管理系统等,都会有着一定的帮助。

总体流程

创建layout布局

在这里插入图片描述

将所有router组件进行注册

在这里插入图片描述

进行编码

<template>
	<Layout  class="layout"  :style="{minHeight: '100vh'}">
	<Sider   style="z-index: 5;" width="240" collapsible :collapsed-width="120"  v-model="isCollapsed">
		 <Menu  :class="menuitemClasses" active-name="1-1" width="auto" :theme="dark" accordion  @on-select="menuSelect"  @test='menuSelect' :style="{height:mainHeight+'px'}">  
                            <Submenu v-for="item in menuData" :name="item.name"  :key="item.name">  
                                <template slot="title">
                                    <Icon type="ios-analytics"></Icon><span>{{item.label}} </span> 
                                </template>  
                                <MenuItem v-for="mi in item.menuitems" :name="mi.name" :key="mi.name">
									<Icon type="ios-navigate"></Icon>
								<span>{{mi.label}}</span>
								</MenuItem>  
                            </Submenu>
                        </Menu>  
						<!-- <Tree :data="baseData"  show-checkbox></Tree> -->
						
	</Sider>
	 <Layout>
	<Content style="height: 859px;">
					<Tabs type="card" @on-tab-remove="removeTab" @on-click="clickTab" :animated="false" :value="activeTab">
								<template v-for="(item,index) in mainTabs" >
							        <TabPane :key="item.name" :label="item.label" closable :name="item.url" v-if="item.show">	
							        </TabPane>
								</template>
								<router-view  width="100%" :height="frameHeight"></router-view>
				`	</Tabs>
	</Content>
	</Layout>
	</Layout>
</template>

<script>
	export default{
		data(){
			return{
				isCollapsed:false,
				baseData: [{
                    expand: true,
                    title: 'parent 1',
                    children: [{
                        title: 'parent 1-0',
                        expand: true,
                        disabled: true,
                        children: [{
                            title: 'leaf',
                            disableCheckbox: true
                        }, {
                            title: 'leaf',
                        }]
                    }, {
                        title: 'parent 1-1',
                        expand: true,
                        checked: true,
                        children: [{
                            title: '<span style="color: red">leaf</span>',
                        }]
                    }]
                }],
				 menuData:[  
                        {   label:'系统管理',name:"m1",  
                            menuitems:[  
                                {name:'m1-1',label:'用户管理',url:'/user'}
                            ]  
                        },  
                        {   label:'车主秘书',name:"m2",  
                            menuitems:[  
                                {name:'m2-1',label:'车主秘书业务管理',url:'/secretary'}
                            ]  
                        },  
                        {   label:'新车牌照批改',name:"m3",  
                            menuitems:[  
                                {name:'m3-1',label:'新车牌照批改业务管理',url:'/newLicenseActing'},  
                                {name:'m3-2',label:'新车牌照批改业务处理',url:'/newLicenseBusiness'}
                            ]  
                        },  
                        {   label:'酒后代驾',name:"m4",  
                            menuitems:[  
                                {name:'m4-1',label:'酒后代驾业务管理',url:'/substituteDrivingActing'},  
                                {name:'m4-2',label:'酒后代驾业务处理',url:'/substituteDrivingBusiness'}
                            ]  
                        },  
                        {   label:'代检车',name:"m5",  
                            menuitems:[  
                                {name:'m5-1',label:'代检车业务管理',url:'/vehiclemanagementActing'},  
                                {name:'m5-2',label:'代检车业务处理',url:'/vehicleinspectionBusiness'}
                            ]  
                        },
						{
							label:'日程表',name:'m6',
							menuitems:[
								{name:'m6-1',label:'日程表管理',url:'/calendar'}
							]
						}
                    ],
					 activeTab:null,  
                    mainHeight: 0,  
                    frameHeight: 0,  
                    mainTabs:[],
					dark:"dark"
			}
		},
        computed: {
            menuitemClasses: function () {
                return [
                    'menu-item',
                    this.isCollapsed ? 'collapsed-menu' : ''
                ]
            }
        },
		 mounted:function(){  
                this.setFrameHeight();  
            },  
		methods:{
			menuSelect:function(name){ 
                    var tab = this.getTab(name);  
                    if(tab==null){  
                        var mi = this.getMenuItem(name);  
						mi["show"] = true;
                        this.mainTabs.push(mi);
                    }  
                    else{  
                        tab.show=true;  
                    }  
					 var qqq = this.getMenuItem(name);  
					this.$router.push(qqq.url);
                    this.activeTab=name;  
                },
			 getTab:function(name){  
						for(var i=0; i<this.mainTabs.length; i++){  
							if(this.mainTabs[i].name==name)return this.mainTabs[i];  
						}  
						return null;//没有找到  
			},
			 removeTab:function (name) {
				 for(let i = 0;i<this.mainTabs.length;i++){
					 if(this.mainTabs[i].url==name){
						 this.mainTabs.splice(i, 1);
					 }
				 }
				 console.log(this.mainTabs)
				 
				 if(this.mainTabs.length==0){
					 this.$router.push("/welcome")
				 }else{
					 this.$router.back(-1)
				 }
			},
			 clickTab:function(name){ 
				 this.$router.push(name);
                    var vm=this;  
                    vm.frameHeight -= 1;  
             },
			  getMenuItem:function(name){  
                    for(var sm=0; sm<this.menuData.length; sm++){  
                        for(var mi=0; mi<this.menuData[sm].menuitems.length; mi++){  
                            if(this.menuData[sm].menuitems[mi].name==name)
							return this.menuData[sm].menuitems[mi];  
							
                        }  
                    }  
                    return {};//这个应该不可能发生  
                },
				 onAuthor:function(){  
                    this.$Message.info("wallimn,http://wallimn.iteyey.com");  
                },
				   setFrameHeight:function(){ 
                    //调整掉一些补白的值  
                    this.mainHeight = (document.documentElement.scrollHeight || document.body.scrollHeight)-90-90;  
                    this.frameHeight = this.mainHeight-90;  
                }
		},
		created(){
			 if(this.mainTabs.length==0){
								 this.$router.push("/welcome")
			}
		}
	}
</script>

<style>
	.layout-con{
        height: 100%;
        width: 100%;
    }
    .menu-item span{
        display: inline-block;
        overflow: hidden;
/*        width: 69px; */
        text-overflow: ellipsis;
        white-space: nowrap;
        vertical-align: bottom;
        transition: width .2s ease .2s; 
    }
    .menu-item i{
        transform: translateX(0px);
        transition: font-size .2s ease, transform .2s ease;
        vertical-align: middle;
        font-size: 16px;
    }
    .collapsed-menu span{
        width: 0px;
        transition: width .2s ease; 
    }
    .collapsed-menu i{
        transform: translateX(5px);
        transition: font-size .2s ease .2s, transform .2s ease .2s;
        vertical-align: middle;
        font-size: 22px;
    }
</style>

总结

本次学习iview,进行的前台页面编写,可直接拿来进行后台链接,中间也踩了很多控件的坑,感触良多,使我对vue、iview的理解更深刻,router进行的路由跳转的三种方式。本次采用的是vue双向绑定机制,循环遍历菜单和选项卡,进行一个router-view多次进行跳转,返回上一级和判断是否为空显示首页欢迎页面。
小弟学习iview阶段所编写,也参照了其他大佬们所编写的文章。
以上全是小弟的项目心得,希望各位大大多多照顾。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!