Elementui tabs组件内添加组件
1. Elementui tabs组件内添加组件
1.1. 需求
- 今天的一个需求是在后台框架的基础上添加tab页,结果页面如下 
  
- 原本上述红框内的内容是不存在的,直接点击左侧菜单栏进行页面跳转,现加了tab标签栏,实现快速的跳转 
1.2. 实现
- 具体要根据自己的route实现类进行筛选,核心vue如下
<template>
  <div>
    <el-tabs v-model="TabsValue" type="card" closable @tab-remove="removeTab">
      <el-tab-pane style="border-radius: 3px" v-for="(item, index) in Tabs" :key="item.name" :label="item.title" :name="item.name">
        <tab-component style="border-radius: 3px;margin: -15px 10px 0px 10px;" :index="index" :name="index"></tab-component>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>
<script>
  import Vue from 'vue'
  export default {
    name: 'TabBar',
    data(){
      return {
        uniqueOpened: true,
        TabsValue: '',
        Tabs: [],
        index:0,
        tabComponent:{}
      }
    },
    methods: {
      addOneTab(menu) {
        var exist = false;
        for (var i = 0; i < this.Tabs.length; i++) {
          if (menu.name === this.Tabs[i].name) {
            exist = true;
            break
          }
        }
        if (exist === true) {
          this.TabsValue = menu.name;
          return
        }
        this.Tabs.push({
          title: menu.name,
          name: menu.name,
          content: menu.component
        });
        var _this = this;
        this.tabComponent = Vue.component('tab-component', {
          render: function (h) {
            var comp = _this.Tabs[this.index].content;
            return h(comp)
          },
          props: {
            index: {
              type: Number,
              required: true
            }
          }
        });
        this.TabsValue = menu.name
      },
      addTab(e) {
        let first = "/"+e.split("/")[1];
        let two = e.split("/")[2];
        let tempRoutes = this.$router.options.routes;
        for (let i = 0; i < tempRoutes.length; i++) {
          let temp = tempRoutes[i];
          if (temp.path === first) {
            for (let j = 0; j < temp.children.length; j++) {
              let child = temp.children[j];
              if (child.path === two) {
                let menu = {};
                menu.name = child.meta.title;
                menu.component = child.component;
                this.addOneTab(menu);
              }
            }
          }
        }
      },
      removeTab(targetName) {
        let tabs = this.Tabs;
        let activeName = this.TabsValue;
        if (activeName === targetName) {
          tabs.forEach((tab, index) => {
            if (tab.name === targetName) {
              let nextTab = tabs[index + 1] || tabs[index - 1];
              if (nextTab) {
                activeName = nextTab.name;
              }
            }
          });
        }
        this.TabsValue = activeName;
        this.Tabs = tabs.filter(tab => tab.name !== targetName);
      }
    }
  }
</script>
- 上述是tab的实现,再就是菜单选择调用tab的addTab方法
<el-menu @select="addTab" mode="vertical" unique-opened :default-active="$route.path" :collapse="isCollapse"
         background-color="#304156" text-color="#fff" active-text-color="#409EFF">
  <sidebar-item :routes="routes"></sidebar-item>
</el-menu>
addTab(e) {
  this.$refs.tabBar.addTab(e);
}
- 上面代码会看着有点奇怪,因为SideBar,也就是上述的el-menu所在组件和tab是平级的,如下
<template>
  <div class="app-wrapper" :class="{hideSidebar:!sidebar.opened}">
    <sidebar ref="sidebar" @addTab="addTab" class="sidebar-container"></sidebar>
    <div class="main-container">
      <navbar></navbar>
      <tab-bar ref="tabBar"></tab-bar>
      <app-main></app-main>
    </div>
  </div>
</template>
siderBar和tab-bar在同一个组件内,所以要实现参数传递,需要先emit提交事件,再在父组件传递给另一个子组件,这样链路就完整了,没看懂我的看下面的参考吧,我也是参考它的结合自己的代码实现
1.3. 参考
- 参考自该问答陶通的回答
Elementui tabs组件内添加组件的更多相关文章
- vue2.X  props  数据传递  实现组件内数据与组件外的数据的双向绑定
		vue2.0 禁止 子组件修改父组件数据 在Vue2中组件的props的数据流动改为了只能单向流动,即只能由组件外(调用组件方)通过组件的DOM属性attribute传递props给组件内,组件内只能 ... 
- 【HarmonyOS】【Demo】【JAVA UI】 鸿蒙怎么在Webview上添加组件
		在大家HarmonyOS开发中,Webview组件上添加组件可能是很常见的功能了,HarmonyOS的webview和Android的webwiew存在一点点区别,今天来实现这个功能 使用项目布局显示 ... 
- Vue_子级组件调用主组件函数
		<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ... 
- element-ui 的el-button组件中添加自定义颜色和图标的实现方法
		这篇文章主要介绍了element-ui 的el-button组件中添加自定义颜色和图标的实现方法,目前的解决方案是:添加一个自定义全局指令,同时在element-ui源码中,加入对应的组件.需要的朋友 ... 
- Ionic4.x Theming(主题) 增加内置主题 颜色 修改内置组件默认样式 修改底部 Tabs 背景颜色以及按钮颜色
		1.Ionic4.x Theming(主题) Ionic4.x 修改主题颜色的话需要在 src/theme/variables.scss 文件中修改. https://ionicframework.c ... 
- form-create教程:给内置组件和自定义组件添加事件
		本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ... 
- 仿ElementUI构建自己的Vue组件库用babel-plugin-component按需加载组件及自定义SASS主题
		最近使用ElementUI做项目的时候用Babel的插件babel-plugin-component做按需加载,使得组件打包的JS和CSS包体积大大缩小,加载速度也大大提升,所有想模仿做一个组件库也来 ... 
- Vue内置组件[回顾]
		1.动态组件 在某些场景,往往需要我们动态切换页面部分区域的视图,这个时候内置组件component就显得尤为重要. component接收一个名为is的属性,is的值应为父组件中注册过的组件的名称, ... 
- vue3常见问题及解决方案(四)父组件切换行,然后子组件切换tab,子组件内的数据不刷新
		问题描述 父组件切换行,然后子组件切换tab,子组件内的数据不刷新. 例如父组件为订单,子组件为订单相关商品和相关客户,商品和客户使用tab选项卡组织. 当tab显示商品页时,切换订单,商品页内容跟着 ... 
随机推荐
- [BZOJ3751][NOIP2014]解方程(数学相关+乱搞)
			题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ... 
- 剑客决斗(NYOJ 110)
			T3.题目110剑客决斗 (http://acm.nyist.net/JudgeOnline/problem.php?pid=110) 描述 在路易十三和红衣主教黎塞留当权的时代,发生了一场决斗.n个 ... 
- Linux下汇编语言学习笔记3 ---
			这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ... 
- 使用GSON解析JSON文件
			package com.pingyijinren.test; /** * Created by Administrator on 2016/5/19 0019. */ public class App ... 
- PKCS填充方式
			1)RSA_PKCS1_PADDING 填充模式,最常用的模式要求: 输入 必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11.如果输入的明文 ... 
- 安装最新版本的zabbix
			1. 先安装php5.4 最新版本: yum安装php5.4或5.5 https://blog.csdn.net/MarkBoo/article/details/49424183 2. 然后参照官网或 ... 
- chdoj38 K-partite Graph(补图)
			题意: 若一个无向图G的节点能够分成k(k>=2)个非空集合,对于每对点,当且仅当他们属于不同的集合,存在一条边(ui,vi)连接他们.那么这个图就是一个完全k分图. 现在给出一个n点,m条边的 ... 
- Python循环定时服务功能(相似contrab)
			Python实现的循环定时服务功能.类似于Linux下的contrab功能.主要通过定时器实现. 注:Python中的threading.timer是基于线程实现的.每次定时事件产生时.回调完响应函数 ... 
- nopcommerce 电商商城 ASP.NET 开源系统
			nopcommerce 电商商城 ASP.NET 开源系统 
- ios网络学习------11 原生API文件上传之断点续传思路
			watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhbmcyMDA5MzAzNTEz/font/5a6L5L2T/fontsize/400/fill/I0 ... 
