vue2使用el-tag實現(xiàn)自定義菜單導航標簽
需求:使用el-tag寫個菜單導航欄,點擊路由的時候就添加
功能:
- 設置鼠標橫向滾動并且不展示滾動條
- 添加關閉其他、關閉左側(cè)、關閉右側(cè)、全部關閉標簽功能
- 單個標簽刪除功能添加,固定標簽不可刪除
- 右鍵點擊展開操作菜單欄
- 設置個默認固定的標簽,比如首頁
- 點擊標簽后el-menu對應路由激活
1.效果
1.1滾動條效果如下
1.2標簽操作如下
2.滾動條代碼講解和實現(xiàn)
滾動條我使用的是自定義指令實現(xiàn)的,給最外層的tag一個div包裹并且設置寬高和自定義指令
v-horizontal-scroll:自己寫的不是系統(tǒng)自帶的,名字要和directives下horizontal-scroll的對應不然監(jiān)聽不到
event.preventDefault();阻止默認事件觸發(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首先獲取到標簽頁需要展示的數(shù)據(jù)
第一步,監(jiān)聽路由,這個路由我寫了el-menu通過點擊路由進行監(jiān)聽,意思是如果是已有的路由那么就標簽頁跳轉(zhuǎn)到對應路由的標簽,如果沒有,那么就添加標簽。
tagsData: [
{
title: "首頁",
path: "/home",
},
],
這個是固定的標簽,首頁不能被刪除
watch: { // 監(jiān)聽當前路由 $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標簽樣式和標簽屬性講解
1.:closable="index > 0":標簽是否可以關閉,index>0也就是除了首頁外其他的標簽都有個x,表示可以關閉
2.:effect="item.title == $route.meta.title ? 'dark' : 'plain'"控制標簽點擊后的顏色改變,也就是主題改變
3.contextmenu.native.prevent監(jiā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>
樣式如下 也就是添加了個小圓點
.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事件代碼講解
點擊事件后,如果重復點擊會報錯,所以這邊我做了個判斷
// 點擊標簽跳轉(zhuǎn) goPath(path) { // 解決重復點擊會報錯,數(shù)據(jù)冗余 if (path !== this.$route.path) { this.$router.push(path); } this.closeMenus(); },
點擊關閉標簽后對應的路由肯定也得跟著跳轉(zhuǎn)啊,跳轉(zhuǎn)代碼如下
close(i) { if ( this.tagsData[i].path == this.$route.path && i !== this.tagsData.length - 1 ) { // 直接跳轉(zhuǎn)到最后一項了 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); } // 關閉當前項,本質(zhì)上就是刪除tags的對應項 this.tagsData.splice(i, 1); this.closeMenus(); },
3.4點擊關閉操作欄
點擊右鍵的時候打開操作欄了,但是之后關閉掉,要關閉只能把isShowTagsMenu=false就行
mounted() { // 給文檔添加點擊事件 document.addEventListener("click", this.closeMenus); }, methods: { // 關閉選擇菜單 closeMenus() { this.isShowTagsMenu = false; }, }
4.完整代碼
完整代碼地址如下:
vue2自定義導航欄: vue2自定義導航欄并設置樣式 (gitee.com)
到此這篇關于vue2使用el-tag實現(xiàn)自定義菜單導航標簽的文章就介紹到這了,更多相關vue2自定義菜單導航內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- vue2+element?ui?中的el-table?選中當前行當前行變色的實現(xiàn)代碼
- Vue2+Element-ui實現(xiàn)el-table表格自適應高度的案例
- vue2+elementui的el-table固定列會遮住橫向滾動條及錯位問題解決方案
- Vue2 Element el-table多選表格控制選取的思路解讀
- VUE2.0+ElementUI2.0表格el-table循環(huán)動態(tài)列渲染的寫法詳解
- VUE2.0 ElementUI2.0表格el-table自適應高度的實現(xiàn)方法
- vue2.0 + element UI 中 el-table 數(shù)據(jù)導出Excel的方法
- vue2實現(xiàn)在el-table里插入el-tag的示例代碼
相關文章
Vue利用mockjs編寫假數(shù)據(jù)并應用的問題記錄
這篇文章主要介紹了Vue利用mockjs編寫假數(shù)據(jù)并應用,本文通過實例代碼給大家詳細講解,對Vue?mockjs數(shù)據(jù)相關知識感興趣的朋友跟隨小編一起看看吧2022-12-12Vue的transition-group與Virtual Dom Diff算法的使用
這篇文章主要介紹了Vue的transition-group與Virtual Dom Diff算法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12在vue中使用防抖和節(jié)流,防止重復點擊或重復上拉加載實例
今天小編就為大家分享一篇在vue中使用防抖和節(jié)流,防止重復點擊或重復上拉加載實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11vue中對象的賦值Object.assign({}, row)方式
這篇文章主要介紹了vue中對象的賦值Object.assign({}, row)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03