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

news/2023/11/30 9:08:43

需求:使用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)

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


https://www.xjx100.cn/news/3091952.html

相关文章

std::minus

2023年11月21日&#xff0c;周二下午 目录 简介定义使用方法方法1方法2 简介 std::minus 是 C 标准库中的一个函数对象类模板&#xff0c;位于 <functional> 头文件中。 它提供了一个可调用对象&#xff0c;用于执行减法操作。 函数对象类模板 std::minus<T> 被…

Rust错误处理机制:优雅地管理错误

大家好&#xff01;我是lincyang。 今天&#xff0c;我们要探讨的是Rust语言中的错误处理机制。 Rust作为一种系统编程语言&#xff0c;对错误处理的重视程度是非常高的。它提供了一套既安全又灵活的机制来处理可能出现的错误。 Rust错误处理的两大类别 在Rust中&#xff0…

HTML+CSS+ElementUI搭建个人博客页面(纯前端)

网站演示 搭建过程 html部分 首先下载Vue2&#xff0c;ElementUI等插件&#xff0c;放在你的本地。我这里为了运行方便&#xff0c;把代码放在了一个框架里运行。 下载后引入部分 <link rel"stylesheet" href"{{URL::asset(elementui/lib/theme-chalk/ind…

AR远程辅助技术应用到气象部门有何好处?

随着科技的不断发展&#xff0c;人类对于自然环境的理解和掌控能力也在不断提升。其中&#xff0c;AR(增强现实)技术的应用&#xff0c;为气象监控带来了革命性的变化。AR气象远程监控&#xff0c;就是将AR技术与气象监控相结合&#xff0c;通过虚拟与现实的融合&#xff0c;实…

Linux系统编程 系统编程概念

1.系统调用 系统调用&#xff08;system call&#xff09;其实是 Linux 内核提供给应用层的应用编程接口&#xff08;API&#xff09;&#xff0c;是 Linux 应用层进入内核的入口。不止 Linux 系统&#xff0c;所有的操作系统都会向应用层提供系统调用&#xff0c;应用程序通过…

对比学习15篇顶会论文及代码合集,2023最新

对比学习&#xff08;contrastive learning&#xff09;是现在无监督学习中一种常用的学习机制&#xff0c;它可以在没有标签的数据上进行学习&#xff0c;避免依赖大量标签数据&#xff0c;从而帮助我们更好地理解和利用数据集中的信息&#xff0c;提高模型的性能和表现。 作…

从小米14安装不上应用说起【适配64位】

一、原因 某天早上&#xff0c;同事突然对我说我换了小米14pro手机但是安装不了公司的打卡软件&#xff0c;怎么办呀。一时间&#xff0c;我也不知道原因&#xff0c;看到给我发的安装不上的截图陷入了沉思。随即打开在git仓库里找到这个项目&#xff0c;到本地编译打开&#…

3PC(三阶段提交)

三阶段提交 3PC&#xff08;Three-Phase Commit&#xff09;是一种分布式系统中用于实现事务一致性的协议&#xff0c;它是在2PC&#xff08;Two-Phase Commit&#xff09;的基础上发展而来&#xff0c;旨在解决2PC的一些缺点。与2PC的两个阶段&#xff08;准备和提交&#xf…