基于vue+elementPlus的動態(tài)導航標簽欄tabs具體過程
今天來寫一個導航標簽欄,哈哈,我也不清楚這個功能是不是這個名字。
今天領導說要在系統(tǒng)重添加個導航標簽欄的功能,雖然很簡單但我是第一次做這個功能,有些地方可能想的不夠完美,希望如果有更好想法的朋友能指點指點。如果還可以,也希望給各位同行提供一個小demo,用的時候可以直接拿來用。嘻嘻?。?!
實現(xiàn)思路
首先用到了element-plus框架中tabs的組件,然后數(shù)據(jù)我這里是通過vuex來維護的。在點擊菜單的同時往vuex相關(guān)數(shù)據(jù)數(shù)組中添加一項數(shù)據(jù)即可,刪除也一樣的道理。具體的實現(xiàn)如下:
具體過程
首先,創(chuàng)建一個HeaderTabs.vue的組件,我們使用時直接引用即可
<template> <div class="head_tabs"> <keep-alive> <el-tabs v-model="HeaderTabsActiveName" type="card" @tab-click="handlePathSwicth" class="handleTabs" closable @tab-remove="removeHeaderTabsList" > <el-tab-pane v-for="(item,index) in HeaderTabsList" :key="index" :label="item.topic" :name="item.path" > </el-tab-pane> </el-tabs> </keep-alive> </div> </template> <script setup> import { ref ,watch,computed, onMounted} from 'vue' import { useRouter } from 'vue-router' import { useStore } from 'vuex'; // 聲明路由對象 const router = useRouter(); // 聲明vuex對象 const store = useStore(); const HeaderTabsActiveName = ref('') const HeaderTabsList = ref([]) onMounted(()=>{ // 這里的數(shù)據(jù)都是在vuex中獲取的 HeaderTabsList.value = store.state.HeaderTabs; HeaderTabsActiveName.value = store.state.TabsActiveName; }) // 這里直接監(jiān)聽vuex的數(shù)據(jù)會導致失效,這里可能是因為vue性能問題,vue的底層沒有給vuex的數(shù)據(jù)也進行數(shù)據(jù)綁定吧 // 因此,這里使用computed這個api函數(shù)來返回vuex中的值,然后將此方法體放入watch中監(jiān)聽 const getTabsActiveName = computed(()=>{ return store.state.TabsActiveName; }) // 使用watch監(jiān)聽vuex的數(shù)據(jù),并開啟第一次綁定監(jiān)聽--immediate watch(getTabsActiveName,(o1)=>{ if(o1){ // 我們每添加條數(shù)據(jù)都需要修改相關(guān)的tabs索引,否則選中項是不會高亮的 HeaderTabsActiveName.value = o1; } },{ immediate: true }) // 標簽點擊觸發(fā) const handlePathSwicth = (targetName)=>{ let name = targetName.props.name; store.commit("updateTabsActiveName",name); HeaderTabsActiveName.value = name; // 手動跳轉(zhuǎn),組件不會提供跳轉(zhuǎn)功能 router.push({ path:name }) } // 刪除tabs觸發(fā) const removeHeaderTabsList = (targetName) => { // 使用vuex中自定義的方法刪除數(shù)據(jù) store.commit('removeHeaderTabs', targetName) setTimeout(()=>{ // 利用定時器達到延時方法,防止HeaderTabsActiveName還未變就執(zhí)行下面的跳轉(zhuǎn) router.push({ path:HeaderTabsActiveName.value }) },0) } </script>
下面我們開始編寫vuex中的內(nèi)容
vuex主要的角色是來維護我們的數(shù)據(jù),讓我們的數(shù)據(jù)達到共享的效果,使得我們的數(shù)據(jù)可以在系統(tǒng)中共同使用和維護。 但是使用vuex時需要的代碼量要比pinia要麻煩點。因為本系統(tǒng)采用的是vuex的數(shù)據(jù)存儲方法,因此我們使用vuex的寫法,用pinia編寫時的邏輯都是一樣的。(這里只將關(guān)鍵代碼顯示出來。vuex的具體用法直接百度即可)
首先在state.ts文件中編寫聲明相關(guān)數(shù)據(jù)。
import {ref} from 'vue' //初始化vuex的數(shù)據(jù) const state = { // tabs面包屑的數(shù)據(jù) HeaderTabs:[ { topic:"首頁", path:'/home' } ], TabsActiveName: ref("/home") } export { state }
然后在mutations.ts文件中編寫相關(guān)方法。
// 修改tabs的索引綁定 updateTabsActiveName(state,msg){ // 修改標簽索引 state.TabsActiveName = msg }, // 添加tabs標簽 addHeaderTabs(state,msg){ // 用filter過濾器看添加項是否已存在,如果存在則不添加 let f = state.HeaderTabs.filter(t=>{ return t.path == msg.path }) if(f.length==0){ state.HeaderTabs.push(msg) } state.TabsActiveName = msg.path }, // 刪除tabs標簽 removeHeaderTabs(state,msg){ // 如果要刪除的是首頁就直接退出,這里根據(jù)業(yè)務而定 if(msg=="/home") return; // 通過循環(huán)方式找到要刪除的數(shù)據(jù)項 state.HeaderTabs.forEach((item,index)=>{ if(item.path==msg){ state.HeaderTabs.splice(index,1); return true; } }) // 如果當前顯示頁如刪除項一樣,則自動跳轉(zhuǎn)會首頁,這里也是根據(jù)具體業(yè)務而定 if(state.TabsActiveName==msg){ state.TabsActiveName = "/home" } }
菜單項調(diào)用添加邏輯
最后在需要添加的tabs標簽的地方增加新增按鈕即可,這里直接在系統(tǒng)的菜單欄操作。當用戶點擊菜單項時不僅跳轉(zhuǎn)相關(guān)路由,還調(diào)用剛才相關(guān)的方法,具體代碼如下:
// 這里是LeftMenu.vue中 // 菜單點擊時觸發(fā)的方法 menuClick(row){ // 將當前點擊的對象傳遞給指定方法 this.store.commit("addHeaderTabs",row) // 跳轉(zhuǎn)相關(guān)路由 this.router.push({ path:row.path }) }
應用于界面
最后,最關(guān)鍵的一步,我們現(xiàn)在只是寫好了邏輯,但是還沒在頁面上顯示呢。接下來在自己的主界面上引入組件。
不使用setup語法糖時:
<template> <div class="index"> <HeaderTabs></HeaderTabs> </div> </template> <script> import { defineComponent } from '@vue/composition-api' //@ 后是自己組件的真實路徑 import HeaderTabs from '@/components/page/component/HeaderTabs.vue' export default defineComponent({ components:{ HeaderTabs }, }) </script>
使用setup語法糖:
<template> <div class="index"> <HeaderTabs></HeaderTabs> </div> </template> <script setup> import HeaderTabs from '@/components/page/component/HeaderTabs.vue' </script>
實現(xiàn)效果
新增:
刪除:
公司系統(tǒng)是保密項,不能直接放出來,我直接在自己的畢設項目上添加的,所有樣式看起來有點倉促。哈哈。
總結(jié)
到此這篇關(guān)于基于vue+elementPlus的動態(tài)導航標簽欄tabs的文章就介紹到這了,更多相關(guān)vue elementPlus動態(tài)導航標簽欄tabs內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3中使用styled-components的實現(xiàn)
本文主要介紹了Vue3中使用styled-components的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05Vuex 在Vue 組件中獲得Vuex 狀態(tài)state的方法
今天小編就為大家分享一篇Vuex 在Vue 組件中獲得Vuex 狀態(tài)state的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08