使用vue3.2實現(xiàn)多頁簽導(dǎo)航
一、實現(xiàn)思路
- 單擊菜單時數(shù)據(jù)添加store對象,添加數(shù)據(jù)時要去重以及數(shù)量限制,不可無限添加
- 多頁簽導(dǎo)航數(shù)據(jù)從store對象里取
- 初始化會顯示【首頁】標簽導(dǎo)航,同時固定不可刪除
- 單擊多頁簽導(dǎo)航,跳轉(zhuǎn)到對應(yīng)路由
- 激活樣式處理
- 持久化處理
- 刪除多頁簽導(dǎo)航事件
二、具體實現(xiàn)步驟
1. 定義store
// src/store/tag-list.js import { defineStore } from "pinia"; export const useTagStore = defineStore('tag',{ state: ()=> ({ tagList: [ // 初始化默認展示【首頁】標簽導(dǎo)航 { path:'/index', name: 'index', meta: { title: '首頁'} } ] }), getters: { tagListGetter: state=> state.tagList }, actions: { addTag(item) { this.tagList.push(item) }, delTag(item) { // 找出要刪除的tag的索引值 const i = this.tagList.findIndex(v => v.path === item.path) this.tagList.splice(i,1) } }, // 持久化 persist: { enabled: true, // 開啟 strategies: [ { key: 'tagList', storage: sessionStorage } ] }
2. 單擊菜單時數(shù)據(jù)添加store對象
在導(dǎo)航組件中(naveItem.vue)添加點擊事件addTag
<!-- 無子級 --> <el-menu-item :index="item.path" v-if="!item.children" @click="addTag(item)"> <el-icon><Menu /></el-icon> <span>{{item.meta.title}}</span> </el-menu-item> <!-- 有子級 --> <el-sub-menu :index="item.path" v-else> <template #title>{{item.meta.title}}</template> <nav-item v-for="sub in item.children" :key="sub.path" :item="sub"></nav-item> </el-sub-menu>
addTag方法邏輯如下,已有注釋,不再詳細說明。
import { storeToRefs } from 'pinia' import { useTagStore } from '@/store/tag-list.js' const tagStore = useTagStore() const { tagList } = storeToRefs(tagStore) const { item } = defineProps({ item: { type: Object } }) // 點擊路由,添加標簽導(dǎo)航,注意去重 const addTag = (item) => { // 添加前判斷是否已存在 const isRepeat = tagList.value.some(v => v.path === item.path) // 找到則返回true,否則返回false if(isRepeat) return // 限制最多只能打開10個標簽導(dǎo)航頁 if(tagList.value.length === 10) { // 自動把第二個刪除 tagStore.delTag(tagList.value[1]) } // 添加 tagStore.addTag(item) }
3. 定義一個tag組件
定義一個tag組件,從store中取出tagList并渲染;
1.首頁標簽導(dǎo)航不可關(guān)閉,通過當前tag的path不等于首頁的path來控制el-tag的closeable是否展示;
2.定義默認展示的導(dǎo)航標簽defaultUrl,默認為首頁的path(/index);通過監(jiān)聽路由變化,將defaultUrl 等于變化后的路由地址;并且在template中判斷:tag的path是否等于defaultUrl,是則不設(shè)置type(el-tag不設(shè)置type默認為藍色),其他則為type=info;
3.點擊導(dǎo)航標簽,能夠跳轉(zhuǎn)到對應(yīng)路由,給標簽添加handleJump事件。
4.刪除導(dǎo)航標簽事件
a.刪除的不是當前激活模塊,正常刪除
b.刪除的是當前激活模塊
- 當前激活模塊是最后一個導(dǎo)航標簽,則需要高亮前一個導(dǎo)航標簽
- 當前激活模塊不是最后一個導(dǎo)航標簽,則需要高亮后一個導(dǎo)航標簽
代碼代碼如下:
<div class="tags"> <el-scrollbar class="scroll-container"> <el-tag v-for="(tag,index) in tagList" :key="tag.path" class="mx-1" :closable="tag.path !== '/index'" :type="tag.path === defaultUrl? '' : 'info'" @click="handleJump(tag)" @close="handleClose(tag,index)" > {{ tag?.meta?.title }} </el-tag> </el-scrollbar> </div>
import { ref,watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import { storeToRefs } from 'pinia' import { useTagStore } from '@/store/tag-list.js' const route = useRoute() const router = useRouter() const tagStore = useTagStore() const { tagList } = storeToRefs(tagStore) // 高亮當前路由導(dǎo)航的標簽頁 const defaultUrl = ref('/idnex') watch(route,(newVal,oldVal) => { defaultUrl.value = newVal.path },{deep: true,immediate: true}) // 跳轉(zhuǎn)路由 const handleJump = (tag) => { // 重復(fù)點擊標簽,不跳轉(zhuǎn) if(route.path === tag.path) return router.push(tag.path) } // 關(guān)閉標簽 const handleClose = (tag, i) => { // store 刪除 tagStore.delTag(tag) // 1.刪除非當前模塊,正常刪除 if(route.path !== tag.path) return // 2.刪除當前模塊 if(i === tagList.value.length) { // 2.1當前模塊屬于最后一個模塊,刪除后需要高亮前一個模塊 handleJump(tagList.value[i-1]) }else { // 2.2當前模塊屬于中間模塊模塊,刪除后需要高亮后一個模塊 handleJump(tagList.value[i]) } }
具體效果
到此這篇關(guān)于使用vue3.2實現(xiàn)多頁簽導(dǎo)航的文章就介紹到這了,更多相關(guān)vue多頁簽導(dǎo)航內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unocss(原子化css)?使用及vue3?+?vite?+?ts講解
這篇文章主要介紹了Unocss(原子化css)使用vue3?+?vite?+?ts的方法,簡單介紹了Unocss使用及圖標庫使用,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-11-11vue將后臺數(shù)據(jù)時間戳轉(zhuǎn)換成日期格式
這篇文章主要為大家詳細介紹了vue將后臺數(shù)據(jù)時間戳轉(zhuǎn)換成日期格式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07vue?cli+axios踩坑記錄+攔截器使用方式,代理跨域proxy
這篇文章主要介紹了vue?cli+axios踩坑記錄+攔截器使用方式,代理跨域proxy,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04Vuex unknown action type報錯問題及解決
這篇文章主要介紹了Vuex unknown action type報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02ElementUI中<el-form>標簽中ref、:model、:rules的作用淺析
Element官方文檔中寫到,model是表單數(shù)據(jù)對象,rules是表單驗證規(guī)則,下面這篇文章主要給大家介紹了關(guān)于ElementUI中<el-form>標簽中ref、:model、:rules作用的相關(guān)資料,需要的朋友可以參考下2023-01-01vue事件監(jiān)聽函數(shù)on中的this指針域使用
這篇文章主要介紹了vue事件監(jiān)聽函數(shù)on中的this指針域使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08