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
        }
      }
    },
}


相关文章
|
7月前
|
JavaScript
vue element plus Collapse 折叠面板
vue element plus Collapse 折叠面板
144 0
|
JavaScript 前端开发
jQuery实现从一个页面跳转到另一个页面的指定tab选项卡
jQuery实现从一个页面跳转到另一个页面的指定tab选项卡
89 0
|
JavaScript
vant/vue——在van-tab中写入内容使其中间部分进行滚动
在van-tab中写入内容使其中间部分进行滚动
624 0
|
7月前
|
移动开发 JavaScript 小程序
uView Tabs 标签
uView Tabs 标签
193 0
|
4月前
|
JavaScript 容器
Vue3折叠面板(Collapse)
该组件提供了一个高度可定制的折叠面板,支持多种属性设置,包括折叠面板数据、激活状态、禁用选项、边框风格、复制功能等,并可通过插槽进行进一步自定义。其丰富的样式控制选项使得面板能够适应各种场景需求。在线预览展示了不同配置下的效果。组件基于 Vue 3 开发,利用 `requestAnimationFrame` 模拟实现动画效果,并集成了按钮等其他自定义组件。
128 1
Vue3折叠面板(Collapse)
|
4月前
|
前端开发
css仿el-tabs标签页效果
【8月更文挑战第9天】
40 2
|
7月前
|
前端开发
elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
160 0
layui_03动态选项卡Tab&iframe使用
layui_03动态选项卡Tab&iframe使用
68 0
|
XML JavaScript 小程序
element-ui下拉菜单组件Dropdown
<div id='app' style="margin:50px;"> <!-- 鼠标滑过显示下拉列表 这里设置了触发的方式,注意触发方式不能使用’:’绑定,以及绑定了触发选项时的方法 --> <el-dropdown trigger="hover" @command="handleCommand" > <span class="el-dropdown-link el-input__inner" style="display:block;width:200px;"> <!-- 没有选项的时候,默认显示的
227 0
|
自然语言处理 JavaScript 前端开发
LayUI之动态选项卡Tab&iframe使用
LayUI之动态选项卡Tab&iframe使用
423 0