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显示商品页时,切换订单,商品页内容跟着 ...
随机推荐
- golang函数指针的效果
package main import ( "fmt" ) func fun1(key string) { fmt.Printf("fun11 key=%s\n" ...
- spark streaming基于Kafka的开发
spark streaming使用Kafka数据源进行数据处理,本文侧重讲述实践使用. 一.基于receiver的方式 在使用receiver的时候,如果receiver和partition分配不当, ...
- noip模拟赛 分组
分析:暴力分挺多,也挺好想的,个人感觉两个特殊性质没什么卵用. 对于K=1,n ≤ 1024的情况,从后往前贪心地分,如果能和上一组分在一起就分在一起,否则就再开一组,这样可以保证字典序最小.ai ≤ ...
- 【裸的并查集】POJ 1611 The Suspects
http://poj.org/problem?id=1611 [Accepted] #include<iostream> #include<cstdio> #include&l ...
- 前端开发:JavaScript---DOM & BOM
DOM:Document Object Model 文档对象类型 模态框案例 <!DOCTYPE html> <html lang="en"> <h ...
- Python基础之 一
语言分类:编译型(运行前先编译)和解释型(直接运行),静态语言(需要声明变量类型)和动态语言(不需要声明),强类型定义语言(定义好类型不做强制转换就不可修改类型)和弱类型定义语言(数据类型可以被忽略) ...
- BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序
BitMap利用byte特性 针对排序+去重 最佳实践: 100万条数据的排序+去重用时200毫秒左右 static void Main(string[] args) { ]; /*alias*/ ...
- jackson的应用
直接上代码 package com.demo.jackson.utils; import com.fasterxml.jackson.core.JsonProcessingException; imp ...
- Vue.js组件的通信之父组件向子父组件的通信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Jmeter执行java脚本结束时提示:The JVM should have exited but did not.
使用jmeter对dubbo进行压测时,需要使用jmeter的sampler里的java请求 使用./jmeter.sh -n -t test.jmx -l test.jmx -o -e test后台 ...