vue + element 實現快速關閉動態tabs功能
vue + element 實現快速關閉動態tabs功能
1.效果圖
樣式自行修改,如何製作動態導航欄,請參考我之前的文章,有一章專門記錄如何製作動態tabs,請參考系列文章
2.程式碼
commonTab.vue 動態tabs元件
<template>
<div class="common-tab">
<div class="tab-menu">
<div>
<el-tag
:key="tag.url"
v-for="tag in tags"
:closable="tag.url !== 'home'"
:disable-transitions="false"
@click="changeMenu(tag)"
@close="handleClose(tag)"
:effect="$route.name === tag.url ? 'dark' : 'plain'"
>
<i :class="tag.logo"></i>
{{ tag.name }}
</el-tag>
</div>
</div>
<div class="refresh-btn">
<!-- <i class="el-icon-refresh">重新整理</i> -->
<el-dropdown size="small" @command="handleCommand">
<span class="el-dropdown-link">快速關閉<i class="el-icon-arrow-down"></i> </span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="closeUpPage">關閉左側 <i class="el-icon-close"></i></el-dropdown-item>
<el-dropdown-item command="closeDownPage">關閉右側 <i class="el-icon-close"></i></el-dropdown-item>
<el-dropdown-item command="closeOtherPage">關閉其他 <i class="el-icon-close"></i></el-dropdown-item>
<el-dropdown-item command="closeAllPage">關閉所有 <i class="el-icon-close"></i></el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button type="primary" icon="el-icon-refresh" class="refresh" size="mini" @click="refresh">重新整理</el-button>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
data() {
return {}
},
created() {
// 獲取重新整理之前獲取路由的資訊
const sessionTabs = JSON.parse(sessionStorage.getItem('tabs'))
if (sessionTabs !== null) {
// 獲取到儲存的路由列表之後,將資訊利用vuex進行儲存
this.$store.commit('changeSetTabs', sessionTabs.tabList)
}
},
mounted() {
// 重新整理之前儲存路由資訊
window.addEventListener('beforeunload', e => {
sessionStorage.setItem(
'tabs',
JSON.stringify({
tabList: this.tags,
activeTab: this.$route.name
})
)
})
},
computed: {
...mapState({
tags: state => state.tab.tabList
})
},
methods: {
// 快速關閉
handleCommand(command) {
// 關閉左側
if (command === 'closeUpPage') {
if (this.$route.name !== 'home') {
this.tags.forEach((item, index) => {
if (item.url === this.$route.name && this.tags[index - 1].url !== 'home') {
const nextTab = this.tags[index]
this.$store.commit('selectMenu', nextTab)
this.$router.push({ name: nextTab.url })
this.$store.commit('closeTab', this.tags[index - 1])
}
})
}
}
// 關閉右側
if (command === 'closeDownPage') {
this.tags.forEach((item, index) => {
if (item.url === this.$route.name && this.tags[index + 1] !== undefined) {
const nextTab = this.tags[index]
this.$store.commit('selectMenu', nextTab)
this.$router.push({ name: nextTab.url })
this.$store.commit('closeTab', this.tags[index + 1])
}
})
}
// 關閉其他
if (command === 'closeOtherPage') {
this.tags.forEach((item, index) => {
if (item.url === this.$route.name) {
const nextTab = this.tags[index]
this.$store.commit('colseAllTab', 'closeAll')
this.$store.commit('selectMenu', nextTab)
this.$router.push({ name: nextTab.url })
}
})
}
// 關閉所有
if (command === 'closeAllPage') {
this.$store.commit('colseAllTab', 'closeAll')
this.$router.push({ name: 'home' })
}
},
// 點選切換頁面方法
changeMenu(item) {
this.$router.push({ name: item.url })
this.$store.commit('selectMenu', item)
},
// 關閉介面的方法
handleClose(tag) {
this.tags.forEach((item, index) => {
if (item.url === tag.url && tag.url === this.$route.name) {
const nextTab = this.tags[index + 1] || this.tags[index - 1]
if (nextTab) {
this.$store.commit('selectMenu', nextTab)
this.$router.push({ name: nextTab.url })
}
} else {
this.$router.push({ name: this.$route.name })
}
})
this.$store.commit('closeTab', tag)
},
// 重新整理方法
refresh() {
window.location.reload()
}
}
}
</script>
<style lang="scss" scoped>
@import '~@/assets/scss/common/tab.scss';
</style>
store目錄(vuex)下的 tab.js
export default {
state: {
isCollapse: false,
currentMenu: {}, // 左側選擇當前的路由
tabList: [
{
permissionkey: 'home',
url: 'home',
name: '首頁',
logo: 'iconfont icon-shouye'
}
] // tabs列表
},
mutations: {
// 根據左側導航欄設定tabList的值
selectMenu(state, val) {
if (val.url !== 'home') {
state.currentMenu = val
const result = state.tabList.findIndex(item => item.url === val.url)
if (result === -1) {
state.tabList.push(val)
}
} else {
state.currentMenu = null
}
},
// 關閉tab方法
closeTab(state, val) {
const result = state.tabList.findIndex(item => item.url === val.url)
state.tabList.splice(result, 1)
},
// 關不tabs所有的方法或者關閉其他
colseAllTab(state, val) {
if (val === 'closeAll') {
state.tabList = [
{
permissionkey: 'home',
url: 'home',
name: '首頁',
logo: 'iconfont icon-shouye'
}
]
}
},
// 重新整理頁面之後存進來的值
changeSetTabs(state, val) {
state.tabList = val
},
// 控制關閉/開啟摺疊左側導航事件
collapseMenu(state) {
state.isCollapse = !state.isCollapse
}
},
actions: {}
}
相關文章
- 【easyUI】批量關閉tabsUI
- Vue專案中路由動態傳參功能相關實現Vue路由
- Vue + Element UI + Lumen 實現通用表格功能 - 分頁VueUI
- 基於element-ui實現的vue版的動態表單UIVue
- Vue + element.ui table 分頁功能+搜尋功能的實現VueUI
- vue+element-ui實現動態的許可權管理和選單渲染VueUI
- Vue+Element+JS動態生成form表單實現新增和刪除操作VueJSORM
- vue element框架動態修改夜間模式Vue框架模式
- Vue+Element UI實現CRUDVueUI
- Vue實現自動觸發功能Vue
- win10系統快速啟動怎麼關閉 關閉Windows快速啟動Win10Windows
- vue 實現動態拓撲圖Vue
- (精華)2020年7月18日 vue element-ui實現動態表格VueUI
- win10快速啟動怎麼關閉_win10如何關閉快速啟動Win10
- Vue.js + element-ui + express + mongoDB 實現註冊登入功能Vue.jsUIExpressMongoDB
- windows10怎麼關閉快速啟動_windows10關閉快速啟動的方法Windows
- 如何關閉win10快速啟動_win10系統快速啟動怎麼關閉Win10
- 怎麼關閉Win10系統正式版快速啟動功能Win10
- 怎樣實現關閉connection時自動關閉Statement和ResultSet
- Vue + Element 實現匯入匯出ExcelVueExcel
- vue+Element-ui實現分頁效果VueUI
- 關於vue動態元件Vue元件
- 快速實現釘釘告警通知、處理告警、關閉告警
- Element 利用Tooltip提示框實現動態顯示文字提示
- 動態地址可以實現哪些功能及用途
- VUE動態路由和按鈕的實現Vue路由
- Win10正式版關閉快速啟動功能的方法【圖文教程】Win10
- AntDesign - Vue Table元件 實現動態表格、表頭分組的功能(方式一)Vue元件
- 用Vue、element-ui、axios實現省市區三級聯動VueUIiOS
- vue2 - element彈框自定義指令 實現拖動、縮放Vue
- 【Vue】考試功能實現Vue
- Vue.set()實現資料動態響應Vue
- 自制簡單的Tabs(Vue)Vue
- ZBlog關閉CSRF保護功能(出現非法訪問請關閉)
- Element-UI Table 實現篩選資料功能UI
- Windows+Pycharm+Flask+Vue+Element-Plus 前後端分離實現分寫查詢功能WindowsPyCharmFlaskVue後端
- SHELL指令碼實現Oracle自啟動與關閉指令碼Oracle
- Vue+Element 實現excel的匯入匯出VueExcel