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-12
Vue的transition-group與Virtual Dom Diff算法的使用
這篇文章主要介紹了Vue的transition-group與Virtual Dom Diff算法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
在vue中使用防抖和節(jié)流,防止重復點擊或重復上拉加載實例
今天小編就為大家分享一篇在vue中使用防抖和節(jié)流,防止重復點擊或重復上拉加載實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
vue中對象的賦值Object.assign({}, row)方式
這篇文章主要介紹了vue中對象的賦值Object.assign({}, row)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

