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

 更新时间:2023年12月12日 10:57:42   作者:请叫我欧皇i  
这篇文章主要为大家详细介绍了vue2如何使用el-tag实现自定义菜单导航标签,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

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

功能:

  • 设置鼠标横向滚动并且不展示滚动条
  • 添加关闭其他、关闭左侧、关闭右侧、全部关闭标签功能
  • 单个标签删除功能添加,固定标签不可删除
  • 右键点击展开操作菜单栏
  • 设置个默认固定的标签,比如首页
  • 点击标签后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>
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首先获取到标签页需要展示的数据

第一步,监听路由,这个路由我写了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-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事件代码讲解

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

    // 点击标签跳转
    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)

到此这篇关于vue2使用el-tag实现自定义菜单导航标签的文章就介绍到这了,更多相关vue2自定义菜单导航内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解vue.js双向绑定的实现原理

    深入理解vue.js双向绑定的实现原理

    vue.js是MVVM结构的,同类的还有AngularJs;至于MVC、MVP、MVVM的比较网上已经有很多了,这样不再重复。这篇文章将给大家深入的介绍vue.js双向绑定的实现原理,有需要的朋友们可以参考借鉴,下面跟着小编一起来看看吧。
    2016-12-12
  • 深入分析element ScrollBar滚动组件源码

    深入分析element ScrollBar滚动组件源码

    这篇文章主要介绍了element ScrollBar滚动组件源码深入分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Vue利用mockjs编写假数据并应用的问题记录

    Vue利用mockjs编写假数据并应用的问题记录

    这篇文章主要介绍了Vue利用mockjs编写假数据并应用,本文通过实例代码给大家详细讲解,对Vue mockjs数据相关知识感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • vue_drf实现短信验证码

    vue_drf实现短信验证码

    我们在做网站开发时,登录页面很多情况下是可以用手机号接收短信验证码,本文主要介绍了vue_drf实现短信验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Vue的transition-group与Virtual Dom Diff算法的使用

    Vue的transition-group与Virtual Dom Diff算法的使用

    这篇文章主要介绍了Vue的transition-group与Virtual Dom Diff算法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • VueRouter 原理解读之初始化流程

    VueRouter 原理解读之初始化流程

    这篇文章主要为大家介绍了VueRouter原理解读之初始化流程实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 在vue中使用防抖和节流,防止重复点击或重复上拉加载实例

    在vue中使用防抖和节流,防止重复点击或重复上拉加载实例

    今天小编就为大家分享一篇在vue中使用防抖和节流,防止重复点击或重复上拉加载实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue中对象的赋值Object.assign({}, row)方式

    vue中对象的赋值Object.assign({}, row)方式

    这篇文章主要介绍了vue中对象的赋值Object.assign({}, row)方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 基于element-ui封装表单金额输入框的方法示例

    基于element-ui封装表单金额输入框的方法示例

    这篇文章主要介绍了基于element-ui封装表单金额输入框的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Vue3中的动画过渡实现技巧分享

    Vue3中的动画过渡实现技巧分享

    在现代的前端开发中,用户体验的重要性不言而喻,为了让应用程序更加生动和引人注目,动画和过渡效果是必不可少的元素,本文将以 Vue3 为基础,深入探讨如何在应用程序中实现动画过渡,以及一些技巧和最佳实践,需要的朋友可以参考下
    2025-01-01

最新评论