vue2使用el-tag實(shí)現(xiàn)自定義菜單導(dǎo)航標(biāo)簽
需求:使用el-tag寫個(gè)菜單導(dǎo)航欄,點(diǎn)擊路由的時(shí)候就添加
功能:
- 設(shè)置鼠標(biāo)橫向滾動(dòng)并且不展示滾動(dòng)條
- 添加關(guān)閉其他、關(guān)閉左側(cè)、關(guān)閉右側(cè)、全部關(guān)閉標(biāo)簽功能
- 單個(gè)標(biāo)簽刪除功能添加,固定標(biāo)簽不可刪除
- 右鍵點(diǎn)擊展開操作菜單欄
- 設(shè)置個(gè)默認(rèn)固定的標(biāo)簽,比如首頁(yè)
- 點(diǎn)擊標(biāo)簽后el-menu對(duì)應(yīng)路由激活
1.效果
1.1滾動(dòng)條效果如下
1.2標(biāo)簽操作如下
2.滾動(dòng)條代碼講解和實(shí)現(xiàn)
滾動(dòng)條我使用的是自定義指令實(shí)現(xiàn)的,給最外層的tag一個(gè)div包裹并且設(shè)置寬高和自定義指令
v-horizontal-scroll:自己寫的不是系統(tǒng)自帶的,名字要和directives下horizontal-scroll的對(duì)應(yīng)不然監(jiān)聽不到
event.preventDefault();阻止默認(rèn)事件觸發(fā)
<div class="tabs-container" v-horizontal-scroll></div>
export default { directives: { "horizontal-scroll": { bind: function (el) { el.addEventListener("wheel", function (event) { event.preventDefault(); el.scrollLeft += event.deltaY; }); }, }, }, }
<style lang="scss" scoped> .tabs-container { width: 100%; height: 100%; overflow-x: scroll; overflow-y: hidden; white-space: nowrap; display: flex;} .tabs-container::-webkit-scrollbar { display: none; } </style>
3.主要代碼講解
完整代碼在最后,建議下載完整代碼后再看講解
3.1首先獲取到標(biāo)簽頁(yè)需要展示的數(shù)據(jù)
第一步,監(jiān)聽路由,這個(gè)路由我寫了el-menu通過點(diǎn)擊路由進(jìn)行監(jiān)聽,意思是如果是已有的路由那么就標(biāo)簽頁(yè)跳轉(zhuǎn)到對(duì)應(yīng)路由的標(biāo)簽,如果沒有,那么就添加標(biāo)簽。
tagsData: [
{
title: "首頁(yè)",
path: "/home",
},
],
這個(gè)是固定的標(biāo)簽,首頁(yè)不能被刪除
watch: { // 監(jiān)聽當(dāng)前路由 $route: { immediate: true, handler(val, oldval) { console.log(val, "路由"); const bool = this.tagsData.find((item) => val.path == item.path); if (!bool) { this.tagsData.push({ title: val.meta.title, path: val.path, }); } console.log(this.tagsData, "路由地址"); }, }, tagsData: { immediate: true, handler(val, oldval) { return; }, }, },
3.2標(biāo)簽樣式和標(biāo)簽屬性講解
1.:closable="index > 0":標(biāo)簽是否可以關(guān)閉,index>0也就是除了首頁(yè)外其他的標(biāo)簽都有個(gè)x,表示可以關(guān)閉
2.:effect="item.title == $route.meta.title ? 'dark' : 'plain'"控制標(biāo)簽點(diǎn)擊后的顏色改變,也就是主題改變
3.contextmenu.native.prevent監(jiān)聽右鍵菜單點(diǎn)擊事件并且阻止默認(rèn)事件觸發(fā)
<el-tag class="tag" size="medium" :closable="index > 0" v-for="(item, index) in tagsData" :key="item.path" @click="goPath(item.path)" @close="close(index)" :effect="item.title == $route.meta.title ? 'dark' : 'plain'" @contextmenu.native.prevent="rightClick($event, index)" > <i class="cir" v-show="item.title == $route.meta.title"></i >{{ item.title }} </el-tag>
樣式如下 也就是添加了個(gè)小圓點(diǎn)
.tag { cursor: pointer; margin-right: 5px; height: 37px; line-height: 34px; font-size: 16px; .cir { width: 8px; height: 8px; margin-right: 4px; background-color: #fff; border-radius: 50%; display: inline-block; } }
3.3 el-tag事件代碼講解
點(diǎn)擊事件后,如果重復(fù)點(diǎn)擊會(huì)報(bào)錯(cuò),所以這邊我做了個(gè)判斷
// 點(diǎn)擊標(biāo)簽跳轉(zhuǎn) goPath(path) { // 解決重復(fù)點(diǎn)擊會(huì)報(bào)錯(cuò),數(shù)據(jù)冗余 if (path !== this.$route.path) { this.$router.push(path); } this.closeMenus(); },
點(diǎn)擊關(guān)閉標(biāo)簽后對(duì)應(yīng)的路由肯定也得跟著跳轉(zhuǎn)啊,跳轉(zhuǎn)代碼如下
close(i) { if ( this.tagsData[i].path == this.$route.path && i !== this.tagsData.length - 1 ) { // 直接跳轉(zhuǎn)到最后一項(xiàng)了 this.$router.push(this.tagsData[this.tagsData.length - 1].path); } else if (i === this.tagsData.length - 1) { this.$router.push(this.tagsData[this.tagsData.length - 2].path); } // 關(guān)閉當(dāng)前項(xiàng),本質(zhì)上就是刪除tags的對(duì)應(yīng)項(xiàng) this.tagsData.splice(i, 1); this.closeMenus(); },
3.4點(diǎn)擊關(guān)閉操作欄
點(diǎn)擊右鍵的時(shí)候打開操作欄了,但是之后關(guān)閉掉,要關(guān)閉只能把isShowTagsMenu=false就行
mounted() { // 給文檔添加點(diǎn)擊事件 document.addEventListener("click", this.closeMenus); }, methods: { // 關(guān)閉選擇菜單 closeMenus() { this.isShowTagsMenu = false; }, }
4.完整代碼
完整代碼地址如下:
vue2自定義導(dǎo)航欄: vue2自定義導(dǎo)航欄并設(shè)置樣式 (gitee.com)
到此這篇關(guān)于vue2使用el-tag實(shí)現(xiàn)自定義菜單導(dǎo)航標(biāo)簽的文章就介紹到這了,更多相關(guān)vue2自定義菜單導(dǎo)航內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue2+element?ui?中的el-table?選中當(dāng)前行當(dāng)前行變色的實(shí)現(xiàn)代碼
- Vue2+Element-ui實(shí)現(xiàn)el-table表格自適應(yīng)高度的案例
- vue2+elementui的el-table固定列會(huì)遮住橫向滾動(dòng)條及錯(cuò)位問題解決方案
- Vue2 Element el-table多選表格控制選取的思路解讀
- VUE2.0+ElementUI2.0表格el-table循環(huán)動(dòng)態(tài)列渲染的寫法詳解
- VUE2.0 ElementUI2.0表格el-table自適應(yīng)高度的實(shí)現(xiàn)方法
- vue2.0 + element UI 中 el-table 數(shù)據(jù)導(dǎo)出Excel的方法
- vue2實(shí)現(xiàn)在el-table里插入el-tag的示例代碼
相關(guān)文章
深入理解vue.js雙向綁定的實(shí)現(xiàn)原理
vue.js是MVVM結(jié)構(gòu)的,同類的還有AngularJs;至于MVC、MVP、MVVM的比較網(wǎng)上已經(jīng)有很多了,這樣不再重復(fù)。這篇文章將給大家深入的介紹vue.js雙向綁定的實(shí)現(xiàn)原理,有需要的朋友們可以參考借鑒,下面跟著小編一起來(lái)看看吧。2016-12-12深入分析element ScrollBar滾動(dòng)組件源碼
這篇文章主要介紹了element ScrollBar滾動(dòng)組件源碼深入分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2019-01-01Vue利用mockjs編寫假數(shù)據(jù)并應(yīng)用的問題記錄
這篇文章主要介紹了Vue利用mockjs編寫假數(shù)據(jù)并應(yīng)用,本文通過實(shí)例代碼給大家詳細(xì)講解,對(duì)Vue?mockjs數(shù)據(jù)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-12-12vue_drf實(shí)現(xiàn)短信驗(yàn)證碼
我們?cè)谧鼍W(wǎng)站開發(fā)時(shí),登錄頁(yè)面很多情況下是可以用手機(jī)號(hào)接收短信驗(yàn)證碼,本文主要介紹了vue_drf實(shí)現(xiàn)短信驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Vue的transition-group與Virtual Dom Diff算法的使用
這篇文章主要介紹了Vue的transition-group與Virtual Dom Diff算法的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12在vue中使用防抖和節(jié)流,防止重復(fù)點(diǎn)擊或重復(fù)上拉加載實(shí)例
今天小編就為大家分享一篇在vue中使用防抖和節(jié)流,防止重復(fù)點(diǎn)擊或重復(fù)上拉加載實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-11-11vue中對(duì)象的賦值Object.assign({}, row)方式
這篇文章主要介紹了vue中對(duì)象的賦值Object.assign({}, row)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Vue3中的動(dòng)畫過渡實(shí)現(xiàn)技巧分享
在現(xiàn)代的前端開發(fā)中,用戶體驗(yàn)的重要性不言而喻,為了讓應(yīng)用程序更加生動(dòng)和引人注目,動(dòng)畫和過渡效果是必不可少的元素,本文將以 Vue3 為基礎(chǔ),深入探討如何在應(yīng)用程序中實(shí)現(xiàn)動(dòng)畫過渡,以及一些技巧和最佳實(shí)踐,需要的朋友可以參考下2025-01-01