广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue+elementui实现选项卡功能
  • 873
分享到

vue+elementui实现选项卡功能

2024-04-02 19:04:59 873人浏览 薄情痞子
摘要

本文实例为大家分享了Vue+elementui实现选项卡功的具体代码,供大家参考,具体内容如下 用法: 首先自己先在项目中定义三个组件(顶部TopNav,左侧LeftAside,中间

本文实例为大家分享了Vue+elementui实现选项卡功的具体代码,供大家参考,具体内容如下

用法:

首先自己先在项目中定义三个组件(顶部TopNav,左侧LeftAside,中间Main),这方法三两句话描述不清

我就上我用过的一个项目代码实例(但是这个有点缺陷,没有做像一键清空选项卡,关闭左右侧选项卡的方法)

TopNav

<template>
    <el-menu class="el-menu-demo" mode="horizontal" background-color="#334157" text-color="#fff" active-text-color="#fff">
        <el-button class="buttonimg">
            <img class="showimg" :src="collapsed?imgshow:imgsq" @click="doToggle()">
            <!-- :src="collapsed?imgshow:imgsq" @click="doToggle()" -->
        </el-button>
        <el-submenu index="2" class="submenu">
            <template slot="title">当前用户【{{username}}】身份认证:{{usertype}}</template>
            <el-menu-item index="2-1">设置</el-menu-item>
            <el-menu-item index="2-2" @click="mya()">个人中心</el-menu-item>
            <el-menu-item @click="exit()" index="2-3">退出</el-menu-item>
        </el-submenu>
    </el-menu>
</template>
 
<script>
    export default {
        name: 'LeftAside',
        data: function() {
            return {
                collapsed: false, //是否折叠
                imgshow: require('../assets/img/show.png'),
                imgsq: require('../assets/img/sq.png'),
                username:sessionStorage.getItem("username"),
                usertype:sessionStorage.getItem("deptment")
            };
        },
        methods: {
            doToggle() {
                this.collapsed = !this.collapsed;
                console.log("TopNav的collapsed=%s", this.collapsed);
                this.$emit('top-click', this.collapsed);
            },
            exit() {
                this.$confirm('亲,请不要走,留下好不好?', '提示', {
                    confirmButtonText: '残忍离开',
                    cancelButtonText: '留下~',
                    type: 'warning'
                }).then(() => {
                    this.$router.push('/');
 
                }).catch(() => {});
            },
      mya(){
        
         
      }
        }
    }
</script>
 
<style scoped>
    .el-menu-vertical-demo:not(.el-menu--collapse) {
        border: none;
    }
 
    .submenu {
        float: right;
    }
 
    .buttonimg {
        height: 60px;
        background-color: transparent;
        border: none;
    }
 
    .showimg {
        width: 26px;
        height: 26px;
        position: absolute;
        top: 17px;
        left: 17px;
    }
 
    .showimg:active {
        border: none;
    }
</style>

LeftAside

<template>
  <el-menu router :default-active="$route.path" class="el-menu-vertical-demo" background-color="#334157" text-color="#fff"
    active-text-color="#ffd04b" :collapse="leftCollapsed">
    <!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> -->
    <div class="loGobox">
      <img class="logoimg" src="../assets/img/logo.png" alt="">
    </div>
    <!--
         第一级菜单
         el-submenu属性:
         index:用于菜单折叠,不能重复
         key:菜单项的唯一标识,不可重复
         -->
    <el-menu-item index="/Home" key="Home">
      <i class="el-icon-house"></i>
      <span slot="title">首页</span>
    </el-menu-item>
    <!-- <el-menu-item index="/Page1" key="Page1">
            <i class="el-icon-menu"></i>
            <span slot="title">Page1</span>
        </el-menu-item>
        <el-menu-item index="/Page2" key="Page2">
            <i class="el-icon-menu"></i>
            <span slot="title">Page2</span>
        </el-menu-item> -->
    <el-submenu v-for="root in treenode" :index="'index-'+root.dictId" :key="'key-'+root.dictId">
      <template slot="title">
        <i :class="root.dictIcon"></i>
        <span slot="title">{{root.dictText}}</span>
      </template>
      <!-- 第二级菜单 -->
      <!--
            el-menu-item属性:
            index:用于跳转页面,不能重复
            key:菜单项的唯一标识,不可重复
             -->
 
      <el-menu-item @click="addTab(node.dictUrl,node.dictText)" v-for="node in root.children" :index="node.dictUrl"
        :key="'key-'+node.dictId">
        <i class="el-icon-menu"></i>
        <span slot="title">{{node.dictText}}</span>
      </el-menu-item>
    </el-submenu>
  </el-menu>
</template>
<script>
  export default {
    name: 'LeftAside',
    props: ['leftCollapsed'],
    data: function() {
      return {
        treenode: ''
      };
    },
    methods: {
      addTab: function(url, text) {
        console.log(url, text);
        //调用vuex中的addTab方法,将点击的菜单对应的组件信息添加到已打开的openTabs中
        this.$store.commit('addTab', {
          title: text, //Tab页签标题
          name: url //组件的路由
        });
        //设置当前Tab面板为选中状态
        this.$store.commit('setTabActive', url);
      }
    },
    created() {
      //获取请求路径
      
      let url = this.axiOS.urls.SYSTEM_QUERY;
      
      console.log(url);
      //发送axios请求
      this.axios.post(url, {
        username: sessionStorage.getItem("username")
      }).then(resp => {
        console.log(resp.data);
        this.treenode = resp.data.data;
      }).catch(resp => {});
      //设置首页默认显示
      // this.$router.push('/Home');
    }
  }
</script>

Main

<template style="background-color:floralwhite">
    <el-container class="main-container">
        <el-aside :class="openCollapse">
            <LeftAside :open-collapsed="collapsed"></LeftAside>
        </el-aside>
        //选项卡控件
        <el-container>
            <el-header class="main-header">
                <TopNav @click-collapse="topClick"></TopNav>
            </el-header>
            <el-main class="main-center">
                <el-tabs class="tabs-panel-fit" v-model="activeTab" type="border-card" closable @tab-remove="removeTab">
                    <el-tab-pane v-for="item in openTabs" :key="item.name" :label="item.title" :name="item.name">
                        <component :is="item.content"></component>
                    </el-tab-pane>
                </el-tabs>
            </el-main>
 
       //时钟效果
      <div id="app" style="margin-left: 200px;margin-top: -400px;font-size: 30px;">
          {{date}}
      </div>
        </el-container>
    </el-container>
</template>
 
<script>
    import TopNav from '@/components/TopNav'
    import LeftAside from '@/components/LeftAside'
    export default {
        name: 'Main',
        data: function() {
            return {
                collapsed: false,
        date: new Date()
            };
        },
        methods: {
            topClick: function(collapsed) {
                this.collapsed = collapsed;
            },
            removeTab: function(targetName) {
                //获取所有已打开的Tabs选项卡
                let tabs = this.$store.getters.openTabs;
                //获取当前激活的Tab选项卡
                let activeName = this.$store.getters.activeTab;
                //判断当前激活的Tab选项卡和当前被关闭的Tab选项卡是否相同
                if (activeName === targetName) {
                    //遍历已打开的选项卡
                    tabs.forEach((tab, index) => {
                        //判断是否相同,并获取就近需要被激活选项卡
                        if (tab.name === targetName) {
                            let nextTab = tabs[index + 1] || tabs[index - 1];
                            if (nextTab) {
                                activeName = nextTab.name;
                            }
                        }
                    });
                }
                //激活选项卡
                this.$store.commit('setTabActive', activeName);
                //删除Tab
                this.$store.commit('delTab', tabs.filter(tab => tab.name !== targetName));
            }
        },
        components: {
            TopNav,
            LeftAside
        },
        computed: {//计算属性
            openCollapse: function() {
                return !this.collapsed ? 'main-aside' : 'main-aside-collapsed'
            },
            openTabs: function() {
                let openTabs = this.$store.getters.openTabs;
                let tabs = [];
                if (null == openTabs)
                    return tabs;
                else {
                    for (let tab of openTabs) {
                        let component = resolve => require.ensure([], () => resolve(require('@/views' + tab.name + '.vue')));
                        tabs.push({
                            title: tab.title,
                            name: tab.name,
                            content: component
                        });
                    }
                    return tabs;
                }
            },
            activeTab: {
                get() {
                    return this.$store.getters.activeTab;
                },
                set(val) {
                    this.$store.commit('setTabActive', val);
                }
            }
        },
        //展示时钟的方法
        mounted() {//挂载完成
            console.log(this.$route.path);
            if (this.$route.path == '/Home') {
                this.$store.commit('addTab', {
                    title: '首页',
                    name: '/Home'
                });
                this.$store.commit('setTabActive', '/Home');
            }
 
       let _this = this; // 声明一个变量指向Vue实例this,保证作用域一致
          this.timer = setInterval(() => {
            _this.date = new Date(); // 修改数据date
          }, 1000)
        },
        beforeDestroy() {
          if (this.timer) {
            clearInterval(this.timer); // 在Vue实例销毁前,清除我们的定时器
          }
        }
    }
</script>
 
<style>
    .main-container {
        height: 100%;
        width: 100%;
        box-sizing: border-box;
    }
 
    .main-aside-collapsed {
        
        width: 64px !important;
        height: 100%;
        background-color: #334157;
        margin: 0px;
    }
 
    .main-aside {
        width: 240px !important;
        height: 100%;
        background-color: #334157;
        margin: 0px;
    }
 
    .main-header,
    .main-center {
        padding: 0px;
        border-left: 2px solid #333;
        height: 100%;
        object-fit: fill;
    }
 
    .div-pagination {
        margin: 10px 0px;
        width: 100%;
    }
 
    
    .tabs-panel-fit {
        margin: 0;
        padding: 0;
        
        width: 100%;
        height: 100%;
        object-fit: fill;
    }
 
    
    .el-tabs--border-card>.el-tabs__content {
        padding: 0;
    }
 
    
    .el-tabs.el-tabs--border-card {
        box-shadow: none;
        border-bottom: none;
        border: 0;
    }
 
    
    .el-tabs>.el-tabs__header .el-tabs__item:first-child>span {
        display: none;
    }
 
    
    .el-dialog {
        position: absolute;
        top: 50%;
        left: 50%;
        margin: 0 !important;
        transfORM: translate(-50%, -50%);
        max-height: calc(100% - 30px);
        max-width: calc(100% - 30px);
        display: flex;
        flex-direction: column;
        
        border-radius: 0.4em;
    }
 
    .el-dialog>.el-dialog__body {
        overflow: auto;
    }
 
    .el-dialog__header {
        background-color: #F5F7FA;
        border-bottom: 1px solid #ccc;
        font-size: 14px;
        font-weight: bold;
        padding: 15px 20px 15px;
        
        border-radius: 0.4em 0.4em 0em 0em;
    }
 
    .el-dialog__body {
        padding: 20px 15px;
    }
 
    .el-dialog__footer {
        background-color: #F5F7FA;
        border-top: 1px solid #ccc;
        padding: 15px;
        
        border-radius: 0em 0em 0.4em 0.4em;
    }
 
    .el-form>.el-form-item:last-child {
        margin-bottom: 0px;
    }
 
    
    
    .el-table .el-table__body tr:hover>td{
        background: #FFF68F;
        font-weight:bold;
        color:#000000;
    }
 
    
    
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: vue+elementui实现选项卡功能

本文链接: https://www.lsjlt.com/news/141020.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue+elementui实现选项卡功能
    本文实例为大家分享了vue+elementui实现选项卡功的具体代码,供大家参考,具体内容如下 用法: 首先自己先在项目中定义三个组件(顶部TopNav,左侧LeftAside,中间...
    99+
    2022-11-13
  • vue实现选项卡功能
    本文实例为大家分享了vue实现选项卡功能的具体代码,供大家参考,具体内容如下 原理分析和实现 这个很简单,无非就是一个点击切换显示而已。但是大家也要实现。如果这个看明白了,再看下面...
    99+
    2022-11-13
  • Vue实现简单选项卡功能
    本文实例为大家分享了Vue实现简单选项卡的具体代码,供大家参考,具体内容如下 vue-tab-demo App.vue <template>   <div id=...
    99+
    2022-11-13
  • vue实现简易选项卡功能
    本文实例为大家分享了vue实现简易选项卡功能的具体代码,供大家参考,具体内容如下 1. 效果: 1. 实现发布评论功能 2. 实现评论列表的展示 3. 使用标签页切换的方式来实现 4...
    99+
    2022-11-13
  • vue实现经典选项卡功能
    本文实例为大家分享了vue实现经典选项卡的具体代码,供大家参考,具体内容如下 选项卡方法: 1. vue方法选项卡 2. 事件委托方法性能好点 2大经典选项卡思路: 1.3个li控制...
    99+
    2022-11-13
  • vue怎么实现选项卡功能
    这篇文章主要介绍了vue怎么实现选项卡功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么实现选项卡功能文章都会有所收获,下面我们一起来看看吧。效果:原理分析和实现这个很简单,无非就是一个点击切换显示而...
    99+
    2023-06-29
  • vue如何实现简易选项卡功能
    这篇文章主要讲解了“vue如何实现简易选项卡功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue如何实现简易选项卡功能”吧!1. 效果: 实现发布评论功能 实现评论列表的展示 使用标签页...
    99+
    2023-07-02
  • Vue如何实现简单选项卡功能
    这篇文章将为大家详细讲解有关Vue如何实现简单选项卡功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下vue-tab-demoApp.vue<template> &nbs...
    99+
    2023-06-29
  • jQuery如何实现选项卡功能
    这篇文章主要介绍了jQuery如何实现选项卡功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。效果图:代码如下:<!DOCTYPE&n...
    99+
    2022-10-19
  • jQuery实现嵌套选项卡功能
    本文实例为大家分享了jQuery实现嵌套选项卡功能的具体代码,供大家参考,具体内容如下 知识点总结: 1.siblings():兄弟元素,获得匹配集合中每个元素的同胞,通过选择器进行...
    99+
    2022-11-12
  • vue实现商品详情页功能之商品选项卡
    本文实例为大家分享了vue实现商品详情页功能之商品选项卡的具体代码,供大家参考,具体内容如下 用户点击商品进入商品详情页,默认显示第一个小图对应的大图,然后鼠标滑到小图上,大图也会发...
    99+
    2022-11-12
  • vue实现选项卡案例
    本文实例为大家分享了vue实现选项卡案例的具体代码,供大家参考,具体内容如下 实现步骤 实现静态UI效果 用传统的方式实现标签结构和样式 基于数据重构UI效果 将静态的结构和样式重...
    99+
    2022-11-13
  • vue如何实现选项卡
    这篇文章主要为大家展示了“vue如何实现选项卡”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现选项卡”这篇文章吧。具体内容如下实现步骤实现静态UI效果用传统的方式实现标签结构和样式基...
    99+
    2023-06-29
  • vue怎么实现选项卡
    本篇内容介绍了“vue怎么实现选项卡”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下<!DOCTYPE html>...
    99+
    2023-06-29
  • js简单选项卡功能怎么实现
    要实现简单的选项卡功能,你可以使用JavaScript和HTML的结合。以下是一个简单的选项卡实现示例:```html.tabcon...
    99+
    2023-09-22
    js
  • jQuery中如何实现套选项卡功能
    本篇内容主要讲解“jQuery中如何实现套选项卡功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jQuery中如何实现套选项卡功能”吧!siblings():兄弟元素,获得匹配集合中每个元素的...
    99+
    2023-06-20
  • vue+elementui实现下拉表格多选和搜索功能
    本文实例为大家分享了vue+elementui实现下拉表格多选和搜索的具体代码,供大家参考,具体内容如下 在elementui的基础上对下拉框和表格进行组合 template ...
    99+
    2022-11-12
  • Vue实现Tab选项卡切换
    本文实例为大家分享了Vue实现Tab选项卡切换的具体代码,供大家参考,具体内容如下 点击不同的标题显示出相应的图片 代码如下 <!DOCTYPE html> <...
    99+
    2022-11-12
  • vue实现选项卡小案例
    本文实例为大家分享了vue实现选项卡小案例的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en">   <...
    99+
    2022-11-13
  • Android实现底部导航栏功能(选项卡)
    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能。 我们先看下该d...
    99+
    2022-06-06
    选项卡 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作