您好,登錄后才能下訂單哦!
這篇文章主要講解了“vue怎么實現el-menu和el-tab聯動”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“vue怎么實現el-menu和el-tab聯動”吧!
vue通過el-menus和el-tabs聯動,實現點擊側邊欄,頁面內顯示一行tab以及點擊tab切換路由
實現效果如下
實現思路 左側邊欄添加點擊事件/設置el-menu的路由模式,然后監聽路由的變化,拿到的路由去改變el-tabs綁定的屬性,然后改變el-tab-pane循環的數組,然后設置el-tabs的點擊/刪除事件,最終實現聯動 首先使用vuex定義公共狀態openTab以及activeIndexTab 也就是循環的數組和當前高亮
import Vue from "vue" import Vuex from "vuex" Vue.use(Vuex) export default new Vuex.Store({ state: { openTab: [], activeIndexTab: '' }, mutations: { //添加tab事件 add_tabs (state, data) { state.openTab.push(data) }, //刪除 delete_tabs (state, name) { let index = 0 for (let item of state.openTab) { if (item.name === name) { break } index++ } state.openTab.splice(index, 1) }, //設置高亮tab set_active_index (state, index) { state.activeIndexTab = index }, }, })
html模板
<el-menu> <div v-for="(item, index) in menuList" :key="index"> <el-menu-item :index="item.index" :class="{'isActive':activeIndex == item.index}" @click="routeTo(item)"> <i :class="['icon', item.name]"></i> <span slot="title">{{ item.title }}</span> </el-menu-item> </div> </el-menu> <el-tabs v-model="activeIndexTab" type="card" @tab-click="clickTab" @tab-remove="removeTab" closable> <el-tab-pane v-for="item of openTab" v-if="openTab.length" :key="item.title" :label="item.title" :name="item.name"> </el-tab-pane> </el-tabs>
定義data函數中要用到的屬性
data() { return { activeIndex: "", menuList:[ {"index":"1","title":"商戶資料管理","name":"meansManage"}, {"index":"2","title":"商戶訂單管理","name":"payOrderManage"}, {"index":"3","title":"商戶報表管理","name":"reportManage"}, ] } },
在vuex中取到el-tabs用到的屬性
computed: { openTab () { return this.$store.state.openTab }, activeIndexTab: { get () { return this.$store.state.activeIndexTab }, set (val) { this.$store.commit('set_active_index', val) } }, },
路由配置信息如下
{ path: "/", component: frame, redirect: "/meansManage", children: [ { path: "/meansManage", name: "meansManage", meta:{title:'商戶資料管理'}, component: () => import("../components/merchantManage/meansManage/index.vue") }, { path: "/payOrderManage", name: "payOrderManage", meta:{title:'商戶訂單管理'}, component: () => import("../components/merchantManage/payOrderManage/orderIndex.vue") }, { path:'/reportManage', name:'reportManage', meta:{title:'商戶報表管理'}, component: () => import('../components/merchantManage/reportManage/index.vue') } ] },
隨后監聽路由變化在watch中
watch:{ '$route'(val){ let flag = false this.openTab.forEach(tab => { if (val.path == tab.name) { this.$store.commit('set_active_index',val.path) flag = true return } }) if (!flag) { this.$store.commit('add_tabs', {name: val.path , title: val.meta.title}) this.$store.commit('set_active_index', val.path) } } },
上面的代碼大概意思就是,如果openTab中已經存在這個路由,則直接設置高亮tab,如果不存在,則先添加路由信息到openTab中,然后再設置高亮
7. 當前頁面刷新,需要保留一個tab也就是當前頁的
mounted(){ this.$store.commit('add_tabs', {name: this.$route.path , title: this.$route.meta.title}) this.$store.commit('set_active_index', this.$route.path) }
設置tab的點擊事件
clickTab (tab) { this.$router.push({path: this.activeIndexTab}) }, removeTab (target) { //target當前被點擊的name屬性 if (this.openTab.length == 1) { return } this.$store.commit('delete_tabs', target) if (this.activeIndexTab === target) { // 設置當前激活的路由 if (this.openTab && this.openTab.length >= 1) { this.$store.commit('set_active_index', this.openTab[this.openTab.length - 1].name) this.$router.push({path: this.activeIndexTab}) } } },
感謝各位的閱讀,以上就是“vue怎么實現el-menu和el-tab聯動”的內容了,經過本文的學習后,相信大家對vue怎么實現el-menu和el-tab聯動這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。