vue实现el-menu和el-tab联动的示例代码

vue通过el-menus和el-tabs联动,实现点击侧边栏,页面内显示一行tab以及点击tab切换路由

实现效果如下

实现思路 左侧边栏添加点击事件/设置el-menu的路由模式,然后监听路由的变化,拿到的路由去改变el-tabs绑定的属性,然后改变el-tab-pane循环的数组,然后设置el-tabs的点击/删除事件,最终实现联动 首先使用vuex定义公共状态openTab以及activeIndexTab 也就是循环的数组和当前高亮

import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    openTab: [],
    activeIndexTab: ''
  },
  mutations: {
  //添加tab事件
    add_tabs (state, data) {
      state.openTab.push(data)
    },
    //删除
    delete_tabs (state, name) {
      let index = 0
      for (let item of state.openTab) {
        if (item.name === name) {
          break
        }
        index++
      }
      state.openTab.splice(index, 1)
    },
    //设置高亮tab
    set_active_index (state, index) {
      state.activeIndexTab = index
    },
  },
})

html模板

<el-menu>
 <div v-for="(item, index) in menuList" :key="index">
   <el-menu-item :index="item.index" :class="{'isActive':activeIndex == item.index}" @click="routeTo(item)">
     <i :class="['icon', item.name]"></i>
     <span slot="title">{{ item.title }}</span>
   </el-menu-item>
 </div>
</el-menu>
<el-tabs v-model="activeIndexTab" type="card" @tab-click="clickTab" @tab-remove="removeTab" closable>
 <el-tab-pane v-for="item of openTab" v-if="openTab.length" :key="item.title" :label="item.title" :name="item.name">
 </el-tab-pane>
</el-tabs>

定义data函数中要用到的属性

data() {
 return {
   activeIndex: "",
   menuList:[
     {"index":"1","title":"商户资料管理","name":"meansManage"},
     {"index":"2","title":"商户订单管理","name":"payOrderManage"},
     {"index":"3","title":"商户报表管理","name":"reportManage"},
   ]
 }
},

在vuex中取到el-tabs用到的属性

 computed: {
   openTab () {
     return this.$store.state.openTab
   },
   activeIndexTab: {
     get () {
       return this.$store.state.activeIndexTab
     },
     set (val) {
       this.$store.commit('set_active_index', val)
     }
   },
 },

路由配置信息如下

{
  path: "/",
  component: frame,
  redirect: "/meansManage",
  children: [
    {
      path: "/meansManage",
      name: "meansManage",
      meta:{title:'商户资料管理'},
      component: () => import("../components/merchantManage/meansManage/index.vue")
    },
    {
      path: "/payOrderManage",
      name: "payOrderManage",
      meta:{title:'商户订单管理'},
      component: () => import("../components/merchantManage/payOrderManage/orderIndex.vue")
    },
    {
      path:'/reportManage',
      name:'reportManage',
      meta:{title:'商户报表管理'},
      component: () => import('../components/merchantManage/reportManage/index.vue')
    }
  ]
},

随后监听路由变化在watch中

watch:{
   '$route'(val){
     let flag = false
     this.openTab.forEach(tab => {
       if (val.path == tab.name) {
         this.$store.commit('set_active_index',val.path)
         flag = true
         return
       }
     })
     if (!flag) {
       this.$store.commit('add_tabs', {name: val.path , title: val.meta.title})
       this.$store.commit('set_active_index', val.path)
     }
   }
 },

上面的代码大概意思就是,如果openTab中已经存在这个路由,则直接设置高亮tab,如果不存在,则先添加路由信息到openTab中,然后再设置高亮

7. 当前页面刷新,需要保留一个tab也就是当前页的

mounted(){
	this.$store.commit('add_tabs', {name: this.$route.path , title: this.$route.meta.title})
	this.$store.commit('set_active_index', this.$route.path)
}

设置tab的点击事件

clickTab (tab) {
  this.$router.push({path: this.activeIndexTab})
},
removeTab (target) { //target当前被点击的name属性
  if (this.openTab.length == 1) {
    return
  }
  this.$store.commit('delete_tabs', target)
  if (this.activeIndexTab === target) {
    // 设置当前激活的路由
    if (this.openTab && this.openTab.length >= 1) {
      this.$store.commit('set_active_index', this.openTab[this.openTab.length - 1].name)
      this.$router.push({path: this.activeIndexTab})
    }
  }
},

最终完美实现想要的效果。

到此这篇关于vue实现el-menu和el-tab联动的示例代码的文章就介绍到这了,更多相关el-menu和el-tab联动内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue ElementUI在el-table中使用el-popover问题

    目录 ElementUI在el-table中使用el-popover el-popover在el-table中会出现不显示情况 以下属于个人猜测,为了解释给自己听的 总结 ElementUI在el-table中使用el-popover Vue ElementUI在el-table中使用el-popover,点击嵌套内容中的确定或取消来关闭el-popover. <el-table-column width="100" align="center" label=

  • 如何使用el-table+el-tree+el-select动态选择对应值

    目录 背景描述: 我碰到的问题: 解决问题: 总结 使用el-table+el-select+el-tree来实现element中el-table表格动态选择对应值 背景描述: 项目组的老大让我们完成一个选择一个下拉框中的值,然后再动态选择该下拉框中树形结构的数值,说起来有点绕,给大家截个图,大家就一目了然了. 其实这个功能的实现主要借助与el-table.el-tree.el-select这三个组件就可以实现. 我碰到的问题: (1)el-tree数据不显示. (2)el-tree显示数据后无

  • Vue使用ElemenUI对table的指定列进行合算的方法

    目录 前言 show-summary合计项初始化 sum-tex修改文案 summary-method自定义函数 自定义总计列 单个列 多个列 总结 前言 最近有一个想法,就是记录自己花销的时候,table中有一项内容是花销的金额.然后想在table的底部有一项内容是该金额的总计. 然后我就顺着elemetui的table组件寻找相关的demo,还真发现了一个这样的demo. 对于这个demo,官方是这么描述的: 将show-summary设置为true就会在表格尾部展示合计行.默认情况下,对于

  • JavaScript利用el-table实现绘制热度表

    实现效果 实现代码 <div class="gray w-full h-100 mt-4 table" v-if="props.brandId"> <el-table :data="brandHotList" :header-cell-style="{ 'font-weight': 'normal', 'background-color': '#f7f8f9', }" :cell-style="{

  • Vue中如何合并el-table第一列相同数据

    目录 Vue合并el-table第一列相同数据 业务需求 解决办法 效果展示 el-table合并相同单元格问题 问题描述 解决问题 扩展 总结 Vue合并el-table第一列相同数据 业务需求 需要将el-table表格第一列相同的内容进行合并. 解决办法 el-table中使用 :span-method="objectSpanMethod"方法 vue标签 <el-table :data="contractList" border  style=&quo

  • el-element中el-table表格嵌套el-select实现动态选择对应值功能

    目录 先看问题还原图: 问题描述: 解决方法: 思路: 代码: 总结: 先看问题还原图: 问题描述: 小编在做需求时,遇到了在el-table表格中加入多条数据,并且每条数据要通过el-select来选取相应的值,做到动态选择. 解决方法: 思路: 最开始,小编的实现效果是左边红色框的效果,选择其中一个时,其他的也对应赋值. 主要是因为el-option的选项都是相同的,v-model 的值也是相同的. 那让每一条 v-model 的值不同不就好了么!! 代码: html中代码: <el-tab

  • vue+elementUI-el-table实现动态显示隐藏列方式

    目录 elementUI-el-table动态显示隐藏列 主要代码如下 相关截图 总结 elementUI-el-table动态显示隐藏列 在实际工作场景中,我们在展示数据时,会遇到展示数据过多此时会将数据分页展示,但是如果数据列展示过多,会造成每列数据相对比较拥挤,并且所有的列数据不一定都是必须展示的. 可以将其先隐藏,用户需要时才将其显示在列表之中.所以本文章结合vue+elementUI--中的el-table以及分页实现表格列的动态隐藏与显示. 实现思路:将表格展示+分页+显示/隐藏列

  • element-ui中如何给el-table的某一行或某一列加样式

    目录 1.查阅element-ui官方文档后我们发现有如下属性 :cell-class-name: 2.为表格el-table添加该属性,并指定函数名: :cell-class-name=“addClass” 通过addClass方法为指定行或列添加类名 3.在methods中定义addClass方法,给需要更改样式的行或列添加类名: addClass({row,column,rowIndex,columnIndex}){ if(rowIndex >=this.tableData.length-

  • elementUI el-table二次封装的详细实例

    目录 前言 一.先上页面最终效果 二.创建目录yxt-table如下图 二.数据自动获取和刷新 三.自定义列配置 四.根据搜索条件进行搜索更新表格数据 五.加载中状态和空数据状态 六.完整代码: 总结 前言 很多中后台业务的系统中,表格是最高频的组件之一,其中一般包括搜索条件.表格展示.表格操作列.分页等.那么我们二次封装的这个表格组件就需要包含以下几个功能点: 1.数据自动获取和刷新 2.自定义列配置 3.分页功能 4.根据搜索条件进行搜索功能 5.加载中状态和空数据状态 一.先上页面最终效果

  • vue实现el-menu和el-tab联动的示例代码

    vue通过el-menus和el-tabs联动,实现点击侧边栏,页面内显示一行tab以及点击tab切换路由 实现效果如下 实现思路 左侧边栏添加点击事件/设置el-menu的路由模式,然后监听路由的变化,拿到的路由去改变el-tabs绑定的属性,然后改变el-tab-pane循环的数组,然后设置el-tabs的点击/删除事件,最终实现联动 首先使用vuex定义公共状态openTab以及activeIndexTab 也就是循环的数组和当前高亮 import Vue from "vue"

  • vue+elementui+vuex+sessionStorage实现历史标签菜单的示例代码

    一般是有左侧菜单后,然后要在页面上部分添加历史标签菜单需求. 借鉴其他项目,以及网上功能加以组合调整实现 按照标签实现方式步骤来(大致思路): 1,写一个tagNav标签组件 2,在路由文件上每个路由组件都添加meta属性 meta:{title:'组件中文名'} 3,在store的mutation.js文件中写标签的添加/删除方法以及在方法中更新sessionStorage数据 4,在主页面上添加组件以及router-view外层添加keep-alive组件,我这边是main.vue为登录后主

  • vue滑动吸顶及锚点定位的示例代码

    在上篇文章给大家介绍了vue实现吸顶.锚点和滚动高亮按钮效果 感兴趣的朋友可以点击查看https://www.jb51.net/article/172365.htm 今天给大家继续分享vue滑动吸顶及锚点定位的代码,具体内容如下所示: Vue项目中需要实现滑动吸顶以及锚点定位功能.template代码如下: <template> <div class="main"> <div id='menu'> <ul> <li v-for=&q

  • vue+axios实现图片上传识别人脸的示例代码

    目录 Axios请求 Qs处理数据分析 Vant上传文件格式 完整代码 本文主要介绍了vue+axios实现图片上传识别人脸的示例代码,分享给大家,具体如下: 先看最终效果: 这里采用的是vant的文件上传组件,通过上传图片后端识别图片里的人脸,返回到前端,获取该人脸匹配的工号或学号.以便后续其他系统使用,比如上传成功了一个人脸照片识别成功,可以通过人脸开启会议室的门禁.目前只是做了一个人脸上传的效果. Axios请求 使用axios请求数据,method:post时,data默认的传参数据类型

  • vue loadmore组件上拉加载更多功能示例代码

    最近在做移动端h5页面,所以分页什么的就不能按照传统pc端的分页器的思维去做了,这么小的屏幕去点击也不太方便一般来讲移动端都是上拉加载更多,符合正常使用习惯. 首先简单写一下模板部分的html代码,,很简单清晰的逻辑: <template> <div class="loadmore"> <div class="loadmore__body"> <slot></slot> </div> <d

  • vue中实现图片和文件上传的示例代码

    html页面 <input type="file" value="" id="file" @change='onUpload'>//注意不能带括号 js代码 methods: { //上传图片 onUpload(e){ var formData = new FormData(); f ormData.append('file', e.target.files[0]); formData.append('type', 'test');

  • layui弹出框Tab选项卡的示例代码

    最近做一个项目,使用LAYUI,在界面上Z弹出一个界面A,A上有TAB选项卡,分别为界面B.C:B界面上有一个列表,双击败列表行时,要把数据回写到界面Z; 界面A上有提交按钮,选中B界面上列表某一条数据,界面A上点提交时,同样回写数据到Z: 实现:双击:B上实现双击方法,调用A上界面方法,再调用Z界面上方法: B界面上方法: function dbclick_select(row,index){ debugger; if(row == null){ var nodes=$("#TableSele

  • layui点击导航栏刷新tab页的示例代码

    layui的tab也默认是切换,不会刷新,想要达到点击导航栏刷新tab的功能只需在tab.js文件中将autoRefresh: false,改为true. 以上这篇layui点击导航栏刷新tab页的示例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • React组件内事件传参实现tab切换的示例代码

    本文介绍了React组件内事件传参实现tab切换的示例代码,分享给大家,具体如下: 组件内默认onClick事件触发函数actionClick, 是不带参数的, 不带参数的写法: 如onClick= { actionItem } 带参数的写法, onClick = { this.activateButton.bind(this, 0) } 下面是一个向组件内函数传递参数的小例子 需求: 在页面的底部, 有四个按钮, 负责切换内容, 当按钮被点击时, 变为激活状态, 其余按钮恢复到未激活状态 分析

  • vue不操作dom实现图片轮播的示例代码

    本文介绍了vue不操作dom实现图片轮播的示例代码,分享给大家,具体如下: 效果 宽度为1190px且水平居中的轮播盒子: 中间是当前显示的默认尺寸图片: 左右两边是预显示的小尺寸图片: 轮播从右至左,图片逐渐放大. 做普通平滑轮播也可以参照这个思路 html <ul> <li v-for="(demo,index) in demoList" :key="index" :class="{'demo-left':demoStyle(inde

随机推荐