最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+elementui實現(xiàn)選項卡功能

 更新時間:2022年03月02日 10:59:11   作者:哈巴曼  
這篇文章主要為大家詳細(xì)介紹了vue+elementui實現(xiàn)選項卡功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了vue+elementui實現(xiàn)選項卡功的具體代碼,供大家參考,具體內(nèi)容如下

用法:

首先自己先在項目中定義三個組件(頂部TopNav,左側(cè)LeftAside,中間Main),這方法三兩句話描述不清

我就上我用過的一個項目代碼實例(但是這個有點缺陷,沒有做像一鍵清空選項卡,關(guān)閉左右側(cè)選項卡的方法)

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">當(dāng)前用戶【{{username}}】身份認(rèn)證:{{usertype}}</template>
?? ??? ??? ?<el-menu-item index="2-1">設(shè)置</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(){
? ? ? ? /* this.$router.push('/userCenter'); */
? ? ? ? ?/* this.$router.push('/system/UserCenter'); */
? ? ? }
?? ??? ?}
?? ?}
</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:用于菜單折疊,不能重復(fù)
?? ??? ? key:菜單項的唯一標(biāo)識,不可重復(fù)
?? ??? ? -->
? ? <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:用于跳轉(zhuǎn)頁面,不能重復(fù)
?? ??? ??? ?key:菜單項的唯一標(biāo)識,不可重復(fù)
?? ??? ??? ? -->
?
? ? ? <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);
? ? ? ? //調(diào)用vuex中的addTab方法,將點擊的菜單對應(yīng)的組件信息添加到已打開的openTabs中
? ? ? ? this.$store.commit('addTab', {
? ? ? ? ? title: text, //Tab頁簽標(biāo)題
? ? ? ? ? name: url //組件的路由
? ? ? ? });
? ? ? ? //設(shè)置當(dāng)前Tab面板為選中狀態(tài)
? ? ? ? this.$store.commit('setTabActive', url);
? ? ? }
? ? },
? ? created() {
? ? ? //獲取請求路徑
? ? ? /* let url = this.axios.urls.SYSTEM_TREENODE; */
? ? ? let url = this.axios.urls.SYSTEM_QUERY;
? ? ? /* ?,{username:sessionStorage.getItem("username")} */
? ? ? console.log(url);
? ? ? //發(fā)送axios請求
? ? ? this.axios.post(url, {
? ? ? ? username: sessionStorage.getItem("username")
? ? ? }).then(resp => {
? ? ? ? console.log(resp.data);
? ? ? ? this.treenode = resp.data.data;
? ? ? }).catch(resp => {});
? ? ? //設(shè)置首頁默認(rèn)顯示
? ? ? // 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;
?? ??? ??? ??? ?//獲取當(dāng)前激活的Tab選項卡
?? ??? ??? ??? ?let activeName = this.$store.getters.activeTab;
?? ??? ??? ??? ?//判斷當(dāng)前激活的Tab選項卡和當(dāng)前被關(guān)閉的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(); // 修改數(shù)據(jù)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 {
?? ??? ?/* 在CSS中,通過對某一樣式聲明! important ,可以更改默認(rèn)的CSS樣式優(yōu)先級規(guī)則,使該條樣式屬性聲明具有最高優(yōu)先級 */
?? ??? ?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%;
?? ?}
?
?? ?/* 設(shè)置tabs內(nèi)容面板100%填充父容器 */
?? ?.tabs-panel-fit {
?? ??? ?margin: 0;
?? ??? ?padding: 0;
?? ??? ?/* background-color:#1F2D3D; */
?? ??? ?width: 100%;
?? ??? ?height: 100%;
?? ??? ?object-fit: fill;
?? ?}
?
?? ?/* 設(shè)置tabs內(nèi)容面板的內(nèi)邊距為0 */
?? ?.el-tabs--border-card>.el-tabs__content {
?? ??? ?padding: 0;
?? ?}
?
?? ?/* 設(shè)置tab的表框效果(重要) */
?? ?.el-tabs.el-tabs--border-card {
?? ??? ?box-shadow: none;
?? ??? ?border-bottom: none;
?? ??? ?border: 0;
?? ?}
?
?? ?/*設(shè)置選項卡中第一個首頁選項卡不能關(guān)閉*/
?? ?.el-tabs>.el-tabs__header .el-tabs__item:first-child>span {
?? ??? ?display: none;
?? ?}
?
?? ?/* elementUI dialog彈出框樣式優(yōu)化 */
?? ?.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;
?? ?}
?
?? ?/* 更改table表格的高亮背景色*/
?? ?/* .el-table tr.current-row>td {
?? ??? ?background: #FFF68F;
?? ?} */
?? ?.el-table .el-table__body tr:hover>td{
?? ??? ?background: #FFF68F;
?? ??? ?font-weight:bold;
?? ??? ?color:#000000;
?? ?}
?
?? ?/* 分頁組件 */
?? ?/* .div-pagination {
?? ??? ?margin: 10px 0px;
?? ??? ?width: 100%;
?? ?} */
</style>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue實現(xiàn)下拉菜單樹

    vue實現(xiàn)下拉菜單樹

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)下拉菜單樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • vue3頁面跳轉(zhuǎn)傳值時獲取不到params值的問題解決

    vue3頁面跳轉(zhuǎn)傳值時獲取不到params值的問題解決

    在Vue3頁面跳轉(zhuǎn)時傳遞和獲取參數(shù)通常通過路由參數(shù)和查詢字符串實現(xiàn),本文主要介紹了vue3頁面跳轉(zhuǎn)傳值時獲取不到params值的問題解決,感興趣的可以了解一下
    2024-11-11
  • Vue 仿百度搜索功能實現(xiàn)代碼

    Vue 仿百度搜索功能實現(xiàn)代碼

    本文通過實例代碼給大家介紹了vue仿百度搜索功能,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-02-02
  • Vue3使用Element?Plus實現(xiàn)列表界面的方法步驟

    Vue3使用Element?Plus實現(xiàn)列表界面的方法步驟

    寫后臺管理的時候會有很多列表以及相應(yīng)的條件查詢,下面這篇文章主要給大家介紹了關(guān)于Vue3使用Element?Plus實現(xiàn)列表界面的方法步驟,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 使用provide/inject實現(xiàn)跨組件通信的方法

    使用provide/inject實現(xiàn)跨組件通信的方法

    在 Vue 應(yīng)用中,組件間通信是構(gòu)建復(fù)雜應(yīng)用時的一個常見需求,Vue3.x 提供了provide和inject API,讓跨組件通信變得更加簡潔和高效,本文將深入探討如何使用provide和inject在Vue3.x中實現(xiàn)跨組件通信,并通過示例代碼一步步進行說明,需要的朋友可以參考下
    2024-03-03
  • 利用vue.js把靜態(tài)json綁定bootstrap的table方法

    利用vue.js把靜態(tài)json綁定bootstrap的table方法

    今天小編就為大家分享一篇利用vue.js把靜態(tài)json綁定bootstrap的table方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 基于vue-video-player自定義播放器的方法

    基于vue-video-player自定義播放器的方法

    這篇文章主要介紹了基于vue-video-player自定義播放器的方法,主要是基于video.js開發(fā)的vue-video-player的使用,以及如何操作video.js中的api。需要的朋友可以參考下
    2018-03-03
  • Vue組件之間的通信方式詳細(xì)講解

    Vue組件之間的通信方式詳細(xì)講解

    對于vue來說,組件之間的消息傳遞是非常重要的,用vue可以是要組件復(fù)用的,而組件實例的作用域是相互獨立,這意味著不同組件之間的數(shù)據(jù)無法互相引用,一般來說,組件之間可以有幾種關(guān)系,下面是我對組件之間消息傳遞的常用方式的總結(jié)
    2022-08-08
  • Vue.js實現(xiàn)分頁查詢功能

    Vue.js實現(xiàn)分頁查詢功能

    這篇文章主要為大家詳細(xì)介紹了Vue.js實現(xiàn)分頁查詢功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Ant Design封裝年份選擇組件的方法

    Ant Design封裝年份選擇組件的方法

    這篇文章主要為大家詳細(xì)介紹了Ant Design封裝年份選擇組件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

中方县| 五华县| 河南省| 元朗区| 石嘴山市| 东乡| 河西区| 泗水县| 民权县| 黎平县| 分宜县| 加查县| 灵武市| 庐江县| 台东市| 潞西市| 府谷县| 广安市| 常宁市| 抚远县| 苏尼特右旗| 兴化市| 济阳县| 阳朔县| 滁州市| 木兰县| 永川市| 紫金县| 三河市| 合江县| 肇庆市| 卓尼县| 库伦旗| 中卫市| 齐河县| 新疆| 麻阳| 广水市| 舒兰市| 绿春县| 汶上县|