入口文件

<template><div v-cloak><tabs v-model="value"><pane label="标签一" name="1">标签一内容</pane><pane label="标签二" name="2">标签二内容</pane><pane label="标签三" name="3">标签三内容</pane></tabs></div>
</template>
<script>
import Tabs from '../components/tabs/tabs'
import pane from '../components/tabs/tab'
export default {components: {Tabs,pane},data () {return {value: '1'}}
}
</script>

tabs组件

<template>
<div class="tabs"><div class="tabs-bar"><!--标签页标题,通过v-for实现循环--!><div :class="tabCls(item)"v-for="(item,index) in navList"@click = "handleChange(index)" :key="item.name">{{item.label}}</div></div><div class="tabs-content"><!--slot放置pane组件内容--!><slot></slot></div>
</div>
</template><script>
export default {name: 'Tabs',props: {value: [String, Number],required: true},data () {return {currentValue: this.value,navList: []}},methods: {tabCls (item) {return ['tabs-tab',{'tabs-tab-active': item.name === this.currentValue}]},getTabs () {//获取panereturn this.$children.filter(function (item) {return item.$options.name === 'pane'})},updateNav () {//获取标题,name,并放置到navList数组中this.navList = []let _this = thisthis.getTabs().forEach(function (pane, index) {_this.navList.push({label: pane.label,name: pane.name || index})if (!pane.name) pane.name = indexif (index === 0) {if (!_this.currentValue) {_this.currentValue = pane.name || index}}})this.updateStatus()},updateStatus () {let tabs = this.getTabs()let _this = thistabs.forEach(function (tab) {let b = tab.name === _this.currentValuetab.show = breturn tab.show})},handleChange (index) {let nav = this.navList[index]let name = nav.namethis.currentValue = namethis.$emit('input', name)this.$emit('on-click', name)}},watch: {value: function (val) {this.currentValue = val},currentValue () {this.updateStatus()}}
}
</script><style  scoped>
[v-cloak]{display: none;
}
.tabs{font-size: 14px;color: #657180;
}
.tabs-bar:after{content: '';display: block;width: 100%;height: 1px;background: #d7dde4;margin-top:-1px;
}
.tabs-tab{display: inline-block;padding: 4px 16px;margin-right: 6px;background: #fff;border: 1px solid #d7dde4;cursor: pointer;position: relative;
}
.tabs-tab-active{color: #3399ff;border-top: 1px solid #3399ff;border-bottom: 1px solid #3399ff;
}
.tabs-tab-active:before{content: '';display: block;height: 1px;background: #3399ff;position: absolute;top: 0;left: 0;right: 0;
}
.tabs-content{padding: 8px 0;
}
</style>

pane组件

<template><div class="pane" 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()}},watch: {label () {this.updateNav()}},mounted () {this.updateNav()},computed: {active () {return false}}
}
</script>
<style  scoped>
</style>

效果如下图:

vue实现的tabs标签组件相关推荐

  1. vue实现nav tabs标签页切换

    1.页面组件tagsView.vue.scrollPane.vue <template><div class="tags-view-container">& ...

  2. vue 循环tabs 标签页 组件_Vue render函数实战--实现tabs选项卡组件

    用过Element ui库的童鞋肯定知道组件,简单.好用.可以自定义标签页,不知道广大童鞋们在刚开始使用组件的时候有没有想过它是如何实现的?我咋刚开始使用组件的时候就有去想过,也想去实现一个超级简单的 ...

  3. Vue.js父与子组件之间传参 父向子组件传参   例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为ht

    Vue.js父与子组件之间传参 父向子组件传参 例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为html对 ...

  4. Ant Design Vue中tabs标签页切换导致页面变宽的问题

    问题 在使用Ant Design Vue进行开发的时候,使用了tabs标签页,在页里面套用了表格,但是在页面切换后,会发现页面的width会变大差不多2倍,这样会导致页面一些结构的样式发生变化. 解决 ...

  5. vue使用el-tabs实现标签页(内存+vuex)

    vue使用el-tabs实现标签页(内存+vuex) 效果图: 1: 2: 3:内存中 这是一个组件,例如:pageTabs.vue(组件是可以做到独立监听路由变化的,所以不需要外部调用什么内部的方法 ...

  6. ant design vue table 高度自适应_Vue组件库大评测 Element, iView, HeyUI, Ant Design Vue

    今天偶然的机会想了解下其他Vue相关的组件库,网上刚好有文章,顺便自己做一下笔记,算是资源整理吧 .好了,话不多说,直接开始: 组件库的选择对于前端开发有者至关重要的影响,而组件的丰富性以及健壮性是我 ...

  7. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:组件详解+项目说明...

    缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...

  8. Vue多个单文件组件使用

    在project目录下创建components文件夹,然后将所有子组件放入components文件夹下  [创建此目录][文件名的首字母大写] 1.多组件嵌套使用 Child1.vue <tem ...

  9. .vue文件中style标签的几个标识符

    .vue文件中style标签的几个标识符 在人生就要绝望的时候, 被编辑器所提示的一个scopedSlots所拯救. 卧槽, 写到最后才发现这个属性的具体卵用. 详情见最后解决办法. 问题背景 问题由 ...

最新文章

  1. 社交媒体如何破坏了你的生活? | 大咖来了
  2. (原创)不带模板的DOI输出EXCEL
  3. 项目总结(3.DIBR技术项目总结(1.TOF相机及标定相关))
  4. 如何在移动设备上以开发模式访问SAP Spartacus
  5. Java学习——Java运算符
  6. 将NLog与ASP.NET Core Web应用程序集成
  7. 项目遇到技术难题,领导让我假招聘套取解决方案,我没有照做,结果15天后蒙了
  8. vtk读取.dcm文件(医学影像文件)
  9. HTML基础-跟着李南江学编程
  10. javascript的ActiveXObject造成“Automation服务器不能创建对象”
  11. iOS小技能:设备ID除了使用_idfa、_idfv 还可使用其他替代方案(使用Keychain 存储UUID)
  12. ARM汇编之kile环境
  13. C语言简单编程题——9*9乘法表
  14. vue项目中的小知识--快捷键-vue插件版本号--vscode插件等
  15. pandas表格-拆分Excel的单元格为多行,将多行数据汇聚到一行用分隔符号分开
  16. AutoSAR系列讲解(入门篇)1.1-AutoSAR发展
  17. 微软ghost系统分类合集
  18. 计算机会议期刊投稿,中国计算机学会推荐的投稿期刊和会议
  19. 北京集体户口如何办护照
  20. 第三方应用调用支付宝客户端支付后不跳转回去的问题

热门文章

  1. android安全补丁卸载,这种安全更新能不卸载就不卸载
  2. 远程桌面--------ms12-020 漏洞复现 (死亡蓝屏)
  3. LSI_阵列卡操作手册
  4. 字段定义_ArcGIS开发amp;gdb、shapefile创建与投影定义,字段创建
  5. excel python插件_如何利用Excel与Python制作PPT
  6. STM32时钟学习之STM3210X_RCC.H解读
  7. TOMCAT问题总结
  8. http://blog.chinaunix.net/uid-20577907-id-3519578.html
  9. MongoDB 或者 redis 可以替代 memcached 吗?
  10. druid报异常 “sql injection violation, part alway true condition not allow”的解决方案