vue2使用el-tag自定义菜单导航标签

需求:使用el-tag写个菜单导航栏,点击路由的时候就添加

功能:

  1. 设置鼠标横向滚动并且不展示滚动条
  2. 添加关闭其他、关闭左侧、关闭右侧、全部关闭标签功能
  3. 单个标签删除功能添加,固定标签不可删除
  4. 右键点击展开操作菜单栏
  5. 设置个默认固定的标签,比如首页
  6. 点击标签后el-menu对应路由激活

1.效果

1.1滚动条效果如下

 1.2标签操作如下

2.滚动条代码讲解和实现

滚动条我使用的是自定义指令实现的,给最外层的tag一个div包裹并且设置宽高和自定义指令

v-horizontal-scroll:自己写的不是系统自带的,名字要和directives下horizontal-scroll的对应不然监听不到

 event.preventDefault();阻止默认事件触发

  <div class="tabs-container" v-horizontal-scroll></div>
<script>
export default {directives: {"horizontal-scroll": {bind: function (el) {el.addEventListener("wheel", function (event) {event.preventDefault();el.scrollLeft += event.deltaY;});},},},
}
</script>
<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首先获取到标签页需要展示的数据

第一步,监听路由,这个路由我写了el-menu通过点击路由进行监听,意思是如果是已有的路由那么就标签页跳转到对应路由的标签,如果没有,那么就添加标签。

  tagsData: [

        {

          title: "首页",

          path: "/home",

        },

      ],

这个是固定的标签,首页不能被删除

  watch: {// 监听当前路由$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监听右键菜单点击事件并且阻止默认事件触发

   <el-tagclass="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事件代码讲解

点击事件后,如果重复点击会报错,所以这边我做了个判断

    // 点击标签跳转goPath(path) {// 解决重复点击会报错,数据冗余if (path !== this.$route.path) {this.$router.push(path);}this.closeMenus();},

点击关闭标签后对应的路由肯定也得跟着跳转啊,跳转代码如下 

    close(i) {if (this.tagsData[i].path == this.$route.path &&i !== this.tagsData.length - 1) {// 直接跳转到最后一项了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);}// 关闭当前项,本质上就是删除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)

文章到此结束,希望对你有所帮助~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/205921.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第四十三天【动态规划part05】 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 等于把石头尽量分成重量相同的两堆 动规五部曲 确定dp数组及其下标含义&#xff1a;容量为j的背包&#xff0c;最多能装…

kubeadm join 192.168.10.16:6443 --token xxx报错Failed to request cluster-info

1、node节点执行 kubeadm join 192.168.10.16:6443 --token hak4zi.hrib9uv4p62t1uok --discovery-token-ca-cert-hash sha256:4337638eef783ee6a66045ad699722079e071c2dfbaa21e37d3174f04d58ea97 --v2 报错 [discovery] Failed to request cluster-info, will try again: G…

数据结构与算法编程题8

试编写算法将带头结点的单链表就地逆置&#xff0c;所谓“就地”是指空间复杂度为 O(1)。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; //结点保存的数据struct LNode…

技术分享| anyRTC之RTN网络

RTN(Real-time Network)中文名&#xff1a;实时音视频传输网络。 RTN是最近几年由各大RTC的云厂商提出的一个全新架构的音视频实时传输网络概念。类似于直播的CDN网络&#xff0c;RTN是对音视频的实时性又强烈要求的场景而设计的&#xff0c;原理上全球端到端的时延通过RTN网络…

微服务开发中,使用AOP和自定义注解实现对权限的校验

一、背景 微服务开发中&#xff0c;暴露在外网的接口&#xff0c;为了访问的安全&#xff0c;都是需要在http请求中传入登录时颁发的token。这时候&#xff0c;我们需要有专门用来做校验token并解析用户信息的服务。如下图所示&#xff0c;http请求先经过api网关&#xff0c;网…

云原生正在重塑软件的整个生命周期(内附资料)

随着企业数字化转型进程的发展&#xff0c;企业面临着新旧商业形态的剧变&#xff0c;颠覆和重构时刻都在发生。 企业需要更加快速地感知用户侧的需求变化并做出调整&#xff0c;才有可能在竞争中持续积累优势。业务的个性化、敏捷化、智能化需求日益突显&#xff0c;数字化应…

【Python】Vscode解决Python中制表符和空格混用导致的缩进问题

【Python】Vscode解决Python中制表符和空格混用导致的缩进问题 文章目录 【Python】Vscode解决Python中制表符和空格混用导致的缩进问题1. 问题来源2. 解决Reference 1. 问题来源 在python中使用缩进来进行代码块的分区&#xff0c;通常来说python的一个缩进包含4个空格&#…

[Linux] shell条件语句和if语句

一、条件语句 1.1 测试 test 测试文件的表达式是否成立 格式&#xff1a;test 条件表达式 [ 条件表达式 ] 选项作用-d测试是否为目录-e测试目录或文件是否存在-a测试目录或文件是否存在-f测试是否为文件-r测试当前用户是否有权限读取-w测试当前用户是否有权限写入-x测试当前…

UE4基础篇十五:AI行为树

一、学习完教程后需要掌握知识点 1.1、基础概念: 1.1 行为树:控制并显示AI的决策制定过程 1.2 黑板:可以看做是行为树的创建一些公有变量,外部可以修改行为树黑板的变量值,达到修改行为树状态的逻辑 1.3 环境查询: 获取地图环境中的信息进行一个筛选,查找到所需要的的…

ZLMediaKit安装配置和推拉流

一、ZLMediaKit 库简介 ZLMediaKit 是一个基于 C11 的高性能运营级流媒体服务框架 官方写的项目特点&#xff1a; 基于 C11 开发&#xff0c;避免使用裸指针&#xff0c;代码稳定可靠&#xff0c;性能优越。 支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV/GB28181/MP…

法大大携手广西数通科技,助推金融行业数字化变革

自2017年《关于积极推进供应链创新与应用的指导意见》首次对供应链创新发展作出重要部署以来&#xff0c;我国供应链金融业务实现了有效创新发展。数据显示&#xff0c;2022年&#xff0c;我国供应链金融数字化规模达到11万亿元&#xff0c;数字化渗透率约为30%&#xff0c;相比…

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞 一、漏洞描述二、漏洞影响三、网络测绘四、漏洞复现1.手动复现2.自动化复现3.python源代码 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任…