content

<template>
<div class="tab-content">
<TabBar v-model="activeKey">
<TabBody label="标签一" name="1">
标签一的内容
</TabBody>
<TabBody label="标签二" name="2">
标签二的内容
</TabBody>
<TabBody label="标签三" name="3">
标签三的内容
</TabBody>
<TabBody label="标签四" name="4">
标签四的内容
</TabBody>
</TabBar>
</div>
</template> <script> import TabBar from '@/components/TabBar';
import TabBody from '@/components/TabBody'; export default {
name:"tabContent",
data() {
return{
activeKey:'1'
}
},
components:{
TabBar,
TabBody
} }
</script> <style lang="less">
.tab-header{
display: flex;
justify-content: center;
align-items: center;
line-height: 30px;
.tabs-item{
border-right: 1px solid #eee;
padding: 0 10px;
&:last-child{
border-right: 0;
}
}
}
.tab-content{
padding: 10px;
}
</style>

tabbar

<template>
<div class="tab-bar">
<div class="tab-header">
<div class="tabs-item"
:class="tabCls(item)"
v-for="(item,idx) in navList"
:key="idx"
@click="handlerChange(idx)"
>
{{item.label}}
</div> </div> <div class="tab-body">
<slot></slot>
</div>
</div>
</template> <script>
export default {
props:{
value:{
type:[String,Number]
}
},
data(){
return{
currentValue:this.value,
navList:[]
}
},
methods:{
tabCls(item){
return [
'tabs-tab',
{
'tabs-active':item.name == this.currentValue
}
]
},
handlerChange(idx){
let nav = this.navList[idx];
let name = nav.name;
this.currentValue = name;
this.$emit('input',name)
this.$emit('on-click',name);
},
getTabs(){
return this.$children.filter((item)=>{
return item.$options.name == 'pane'
})
},
updateNav(){
this.navList = [];
this.getTabs().forEach((pane,idx)=>{
this.navList.push({
label:pane.label,
name:pane.name || idx
})
if(!pane.name){
pane.nam = idx;
}
if(idx == 0){
if(!this.currentValue){
this.currentValue == pane.name || idx;
}
}
})
this.updateStatus();
},
updateStatus(){
let tabs = this.getTabs();
tabs.forEach(item=>{
return item.show = item.name === this.currentValue;
})
}
},
watch:{
value(val){
this.currentValue = val;
},
currentValue(){
this.updateStatus();
}
}
}
</script> <style> </style>

tab-body

<template>
<div class="tab-content" v-show="show">
<slot></slot>
</div>
</template> <script>
export default {
name:'pane',
props:{
name:{
type:String
},
label:{
type:String,
default:''
}
},
data() {
return{
show:true
}
},
methods:{
updateNav(){
this.$parent.updateNav();
}
},
mounted(){
this.updateNav();
},
watch:{
label(){
this.updateNav();
}
}
}
</script> <style> </style>

vue-标签页组件的更多相关文章

  1. 一款易用、高可定制的vue翻页组件

    一款易用.高可定制的vue翻页组件 在线体验:pages.cixi518.com 使用 npm i vo-pages --save vo-pages组件父元素必须设置固定高度并填写属性overflow ...

  2. zTab layui多标签页组件

    zTab zTab是一个layui多标签页插件,仿照了layuiAdmin的iframe版Tab实现 当前版本v1.0 码云地址:https://gitee.com/sushengbuyu/zTab ...

  3. vue 标签页以及标签页赋值

    背景: 使用vue增加了标签页,点击不同标签页传给后端的值不一样,用来做区分,如图: vue代码如下: 使用 form.PageA   form.PageB ,后端接收到的值 first.second ...

  4. 《vue.js实战》练习---标签页组件

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. 看JQ时代过来的前端,如何转换思路用Vue打造选项卡组件

    前言 在Vue还未流行的时候,我们都是用JQuery来封装一个选项卡插件,如今Vue当道,让我们一起来看看从JQ时代过来的前端是如何转换思路,用数据驱动DOM的思想打造一个Vue选项卡组件. 接下来, ...

  6. Element-UI标签页el-tabs组件的拖动排序实现

    ElementUI的标签页组件支持动态添加删除,如下图: 但是这个组件不支持标签之间的拖动排序.那么我们自己怎样实现这个功能呢? 有一个叫vuedraggable的组件(https://github. ...

  7. Ant Design Blazor 组件库的路由复用多标签页介绍

    最近,在 Ant Design Blazor 组件库中实现多标签页组件的呼声日益高涨.于是,我利用周末时间,结合 Blazor 内置路由组件实现了基于 Tabs 组件的 ReuseTabs 组件. 前 ...

  8. vue单页面条件下添加类似浏览器的标签页切换功能

    在用vue开发的时候,单页面应用程序,而又有标签页这种需求,各种方式实现不了, 从这个 到这个,然后再返回上面那个 因为每个标签页的route不一样,导致组件重新渲染的问题,怎么都不知道如何实现... ...

  9. 第四节:Vue表单标签和组件的基本用法,父子组件间的通信

    vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  10. Bootstrap入门(十二)组件6:导航标签页

    Bootstrap入门(十二)组件6:导航标签页   1.标签页 2.胶囊式标签页 3.垂直展示 4.两端对齐的标签页 5.禁用的链接 6.添加下拉菜单   先引入本地的CSS文件和JS文件(注:1. ...

随机推荐

  1. day03(变量,常量,输入输出,注释,基本数据类型,运算符)

    一,复习 ''' 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识别的字 ...

  2. centos6.8 配置mysql赋予mysql远程连接权限

    1.关掉防火墙 2.检查3306端口是否开放 3.修改用户用户权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '您的数据库密码' ...

  3. Django缓存机制--rest_framework中节流源码使用的就是django提供的缓存api

    一.配置缓存   https://www.jb51.net/article/124434.htm 二.缓存全站.页面.局部   三.自我控制的简单缓存API API 接口为:django.core.c ...

  4. centos7之rsync+serrsync

    Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别 1.Rsync+Inotify-tools(1):Inotify-tools只能记录下被监听的目录发生了变化(包 ...

  5. JAVA多线程-内存模型、三大特性、线程池

    一.线程的三大特性 原子性.可见性.有序性 1)原子性,即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.原子性其实就是保证数据一致.线程安全一部分. 2)可见性,即 ...

  6. mongoDB 集合(表)操作

    mongoDB 集合(表)操作 集合命名规则 使用 utf8 字符(通常不会起中文名字) 不能含有 "\0" 字符 不要以 system. 开头(否咋会覆盖系统集合开头) 不要和关 ...

  7. 团体程序设计天梯赛(CCCC) L3019 代码排版 方法与编译原理密切相关,只有一个测试点段错误

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  8. JS学习笔记Day12

    一.浏览器的默认行为以及阻止行为 (一)右键菜单事件:oncontextmenu: 阻止:return false: (二)超链接的默认行为:跳转: 阻止:标准浏览器:event.preventDef ...

  9. thinkphp5.0 分页中伪静态的处理

    1.修改文件\thinkphp\library\think\Paginator.php(此文件用于分页) isurl是否为伪静态 加入isurl用于判断是否使用伪静态分页 */ protected $ ...

  10. MongoDB 3.6.9 集群搭建 - 切片+副本集

    1. 环境准备 在Mongo的官网下载Linux版本安装包,然后解压到对应的目录下:由于资源有限,我们采用Replica Sets + Sharding方式来配置高可用.结构图如下所示: 这里我说明下 ...