elementUI el-tabs 实现动态选项卡页面效果

简介: elementUI el-tabs 实现动态选项卡页面效果


<!-- 左侧导航菜单组件 -->
<el-menu :default-active="$route.path" class="el-menu-vertical" 
@select="menuSelect" :collapse="isCollapse">
  <template v-for="(a, $i) in navList">
    <!-- 有子栏目--->
    <el-submenu :key="$i" :index="a.path" v-if="a.children && a.
children.length">
      <template slot="title">
        <i :class="a.icon" /> <span>{{ a.label }}</span>
      </template>
      <el-menu-item-group>
        <el-menu-item v-for="(subItem, $i) in a.children || []" 
:key="$i" :index="subItem.path"><span
            class="sub-text">{{
              subItem.label
            }}</span></el-menu-item>
      </el-menu-item-group>
    </el-submenu>
    <!-- 没有子栏目-->
    <el-menu-item :key="$i" :index="a.path" v-else>
      <i :class="a.icon" /> <span>{{ a.label }}</span>
    </el-menu-item>
  </template>
</el-menu>
<!-- 选项卡组件 -->
<el-tabs v-if="tabs.length" v-model="curTabPath" type="border-card" 
closable @tab-remove="tab_remove">
  <el-tab-pane v-for="a in tabs" :key="a.path" :label="a.label" :name="a.
path">
    <!-- 这里添加页面组件 -->
    <sy v-if="a.path === 'sy'" />
    <khgl v-if="a.path === 'khgl'" />
    <bjkd v-if="a.path === 'bjkd'" />
    <jh v-if="a.path === 'jh'" />
    <tuihuo v-if="a.path === 'tuihuo'" />
    <kc v-if="a.path === 'kc'" />
    <spxx v-if="a.path === 'spxx'" />
    <rk v-if="a.path === 'rk'" />
    <ck v-if="a.path === 'ck'" />
  </el-tab-pane>
</el-tabs>
//引入内页组件
import sy from "./sy";
import khgl from "./khgl";
import bjkd from "./bjkd";
import jh from "./jh";
import tuihuo from "./th";
import kc from "./kc";
import spxx from "./spxx";
import rk from "./rk";
import ck from "./ck";
...
  components: {
    sy,
    khgl,
    bjkd,
    jh,
    tuihuo,
    kc,
    spxx,
    rk,
    ck,
  }
  ,
...
data() {
    return {
      // 选项卡----------------------------------------
      curTabPath: 'sy',
      tabs: [
        { 
            label: '首页', 
            path: 'sy', 
        },
        ],
      // ----------------------------------------
      navList: [
        {
          icon: "el-icon-s-home",
          label: "首页",
          path: "sy",
        },
        {
          icon: "el-icon-sold-out",
          label: "销售",
          path: "xs",
          children: [
            {
              label: "客户管理",
              path: "khgl",
            },
            {
              label: "报价开单",
              path: "bjkd",
            },
          ],
        },
        {
          icon: "el-icon-sell",
          label: "采购",
          path: "cg",
          children: [
            {
              label: "进货",
              path: "jh",
            },
            {
              label: "退货",
              path: "tuihuo",
            },
          ],
        },
        {
          icon: "el-icon-house",
          label: "仓库",
          path: "changku",
          children: [
            {
              label: "库存",
              path: "kc",
            },
            {
              label: "商品信息",
              path: "spxx",
            },
            {
              label: "入库",
              path: "rk",
            },
            {
              label: "出库",
              path: "ck",
            },
          ],
        },
      ],
      // ----------------------------------------
    };
  },
//方法
 methods: {
    // 选项卡----------------------------------------
    // 添加选项卡
    tab_add(d) {
      let has = this.tabs.find(v => v.path === d.path);//查找返回单个对象
      if (has) { return this.curTabPath = d.path }
      this.tabs.push({
        path: d.path,
        label: d.label,
      });
      this.curTabPath = d.path;
    },
    // 移除选项卡
    tab_remove(path) {
      let r = [];
      let nextTabPath = null;
      this.tabs.forEach((v, i, ar) => {
        if (v.path === path) {
          this.tabs[i + 1] && (nextTabPath = this.tabs[i + 1].path);
        } else {
          r.push(v);
        }
      });
      // 删除当前高亮选项卡
      if (r.length && this.curTabPath === path) {
        // 如果当前高亮选项卡右侧有选项卡A,就高亮显示A;如果右侧没有选项卡,就高亮显示最后一个选项卡
        this.curTabPath = nextTabPath || r[r.length - 1].path;
      }
      // 删除最后一个选项卡
      if (r.length === 0) {
        this.curTabPath = null;
      }
      this.tabs = r;
    },
    //----------------------------------------
    // 点击导航菜单
    menuSelect(index, path) {
      this.curTabPath = index;
      let curTab = this.getMenuObj(index)
      this.tab_add(curTab)
    },
    // 查找点击菜单对象
    getMenuObj(index) {
      let aa = this.navList
      for (let i = 0, len = aa.length; i < len; i++) {
        let a = aa[i];
        if (a.path === index) return a
        let bb = a.children || [];
        for (let j = 0, bb_len = bb.length; j < bb_len; j++) {
          let b = bb[j];
          if (b.path === index) return b
        }
      }
    },
}


相关文章
Element UI之el-tabs的样式修改字体颜色、下划线、选中/未选中
Element UI之el-tabs的样式修改字体颜色、下划线、选中/未选中
4217 0
|
JavaScript
Threejs实现标签,自定义样式显示标签
Threejs实现标签,自定义样式显示标签
2246 0
Threejs实现标签,自定义样式显示标签
|
存储 机器学习/深度学习 图形学
位图秘境:解析位图表示法及其在文件系统中的应用(一)
位图秘境:解析位图表示法及其在文件系统中的应用
483 0
|
关系型数据库 MySQL 数据库
Element el-date-picker 日期选择器详解
本文目录 1. 前言 2. 基本用法 3. 日期格式化 4. 选择其他日期单位 5. 选择多个日期 6. 带快捷选项 7. 禁用部分日期 8. 小结
7015 0
Element el-date-picker 日期选择器详解
|
前端开发 Go 网络安全
Go语言:xterm.js-websocket Web终端堡垒机
1.前言 因为公司业务需要在自己的私有云服务器上添加添加WebSsh终端,同时提供输入命令审计功能. 从google上可以了解到xterm.js是一个非常出色的web终端库,包括VSCode很多成熟的产品都使用这个前端库.
7629 0
|
11月前
|
NoSQL Redis 数据安全/隐私保护
挂载配置文件以Docker启动Redis服务
以上步骤提供了一个高效且实用的方式来使用Docker启动并运行带有自定义配置的Redis服务。这些操作可以适用于开发、测试和生产环境,是一种灵活且可扩展的部署方案。通过挂载配置文件和数据卷,您可以轻松地管理和迁移您的Redis实例。
994 9
|
JavaScript
如何解决ElementUI中的el-tab-pane组件使用v-show不生效的问题?
如何解决ElementUI中的el-tab-pane组件使用v-show不生效的问题?
1543 3
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
8443 0
|
JavaScript
vue2中左侧菜单和头部tab标签联动
vue2中左侧菜单和头部tab标签联动
747 0
|
JavaScript UED
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单
【10月更文挑战第5天】本示例展示了如何在 Vue.js 中使用 Element UI 组件实现动态添加和删除嵌套表单项。该表单包含设备信息、设备部位及其对应的任务列表,支持用户动态添加设备部位和任务,并提供相应的表单验证规则。
2113 0
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单