Tabs 标签页
代码演示
标签一
基础用法
Tabs标签页的基础用法;新增Tabs被右键点击事件
查看代码 < />
<template>
<section class="tabs-demo">
<div class="container">
<w-tabs v-model="activeName1" @tab-click="handleClick" @mouse-right-click="handleMouseRightClick">
<w-tab-pane label="标签一" name="first">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="second">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="third">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="fourth">标签四</w-tab-pane>
</w-tabs>
</div>
</section>
</template>
<script>
export default {
data () {
return {
activeName1: 'first'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
},
handleMouseRightClick(tab, event) {
event.preventDefault();
console.log(tab, event)
},
},
}
</script>
标签一
可删除
设置 closable
查看代码 < />
<template>
<section class="tabs-demo">
<div class="container">
<w-tabs v-model="editableTabsValue" @tab-click="handleClick" closable @tab-remove="handleRemove">
<w-tab-pane :key="item.name"
v-for="item in editableTabs"
:label="item.title"
:name="item.name">
{{item.content}}
</w-tab-pane>
</w-tabs>
</div>
</section>
</template>
<script>
export default {
data () {
return {
editableTabsValue: '1',
editableTabs: [{
title: '标签一',
name: '1',
content: '标签一'
}, {
title: '标签二',
name: '2',
content: '标签二'
}, {
title: '标签三',
name: '3',
content: '标签三'
}, {
title: '标签四',
name: '4',
content: '标签四'
}],
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
},
handleRemove(targetName) {
let tabs = this.editableTabs;
let activeName = this.editableTabsValue;
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.editableTabsValue = activeName;
this.editableTabs = tabs.filter(tab => tab.name !== targetName);
},
},
}
</script>
标签一
自定义图标
可以通过具名 slot 来实现自定义标签页的内容。
查看代码 < />
<template>
<section class="tabs-demo">
<div class="container">
<w-tabs v-model="activeName2" @tab-click="handleClick">
<w-tab-pane name="first">
<span slot="label">
<i class="w-icon-user"></i> 标签一
</span>
标签一
</w-tab-pane>
<w-tab-pane name="second">
<span slot="label">
<i class="w-icon-config"></i> 第二标签
</span>
第二标签
</w-tab-pane>
<w-tab-pane name="third">
<span slot="label">
<i class="w-icon-mark"></i> 标签三
</span>
标签三
</w-tab-pane>
<w-tab-pane name="fourth">
<span slot="label">
<i class="w-icon-edit-solid"></i> 标签四
</span>
标签四
</w-tab-pane>
</w-tabs>
</div>
</section>
</template>
<script>
export default {
data () {
return {
activeName2: 'first'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
}
},
}
</script>
<style scoped lang="scss">
.tabs-demo {
.container {
width: 500px;
}
}
</style>
脑卒中易患
标签一
标签一
滑动
可以左右、上下滑动,容纳更多标签。
查看代码 < />
<template>
<section class="tabs-demo">
<div class="box-card">
<w-tabs v-model="activeName3" @tab-click="handleClick" type="border-card">
<w-tab-pane label="脑卒中易患" name="first">脑卒中易患</w-tab-pane>
<w-tab-pane label="脑卒中易患" name="second">脑卒中易患</w-tab-pane>
</w-tabs>
</div>
<div class="box-horizontal">
<w-tabs v-model="activeName4" @tab-click="handleClick">
<w-tab-pane label="标签一" name="third">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="fourth">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="fifth">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="sixth">标签四</w-tab-pane>
<w-tab-pane label="标签五" name="seventh">标签五</w-tab-pane>
<w-tab-pane label="标签六" name="eighth">标签六</w-tab-pane>
</w-tabs>
</div>
<div class="box-vertical">
<w-tabs v-model="activeName5" @tab-click="handleClick"
tab-position="left" style="height: 150px;">
<w-tab-pane label="标签一" name="1">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="2">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="3">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="4">标签四</w-tab-pane>
<w-tab-pane label="标签五" name="5">标签五</w-tab-pane>
<w-tab-pane label="标签六" name="6">标签六</w-tab-pane>
</w-tabs>
</div>
</section>
</template>
<script>
export default {
data () {
return {
activeName3: 'first',
activeName4: 'third',
activeName5: '1'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
}
},
}
</script>
<style scoped lang="scss">
.tabs-demo {
.box-card {
width: 390px;
}
.box-horizontal {
width: 500px;
margin-top: 20px;
}
.box-vertical {
margin-top: 20px;
}
}
</style>
上
标签一
左
标签一
下
标签一
右
标签一
不同位置
根据tab-position设置标签的位置。
查看代码 < />
<template>
<section class="tabs-demo">
<div class="container">
<div class="container__box">
<div class="container__box--inner">
<span class="demonstration">上</span>
<w-tabs v-model="activeName1" @tab-click="handleClick" tab-position="top">
<w-tab-pane label="标签一" name="1">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="2">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="3">标签三</w-tab-pane>
</w-tabs>
</div>
<div class="container__box--inner">
<span class="demonstration">左</span>
<w-tabs v-model="activeName2" @tab-click="handleClick" tab-position="left">
<w-tab-pane label="标签一" name="4">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="5">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="6">标签三</w-tab-pane>
</w-tabs>
</div>
</div>
<div class="container__box">
<div class="container__box--inner">
<span class="demonstration">下</span>
<w-tabs v-model="activeName3" @tab-click="handleClick" tab-position="bottom">
<w-tab-pane label="标签一" name="7">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="8">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="9">标签三</w-tab-pane>
</w-tabs>
</div>
<div class="container__box--inner">
<span class="demonstration">右</span>
<w-tabs v-model="activeName4" @tab-click="handleClick" tab-position="right">
<w-tab-pane label="标签一" name="10">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="11">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="12">标签三</w-tab-pane>
</w-tabs>
</div>
</div>
</div>
</section>
</template>
<script>
export default {
data () {
return {
activeName1: '1',
activeName2: '4',
activeName3: '7',
activeName4: '10'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
}
},
}
</script>
<style scoped lang="scss">
.tabs-demo {
.container {
padding: 0;
display: flex;
flex-wrap: wrap;
.container__box {
padding: 0;
margin: 0 auto;
flex: 1;
border-right: 1px solid #eff2f6;
&:last-child {
border-right: none;
}
.container__box--inner {
padding: 30px 20px;
flex: 1;
min-height: 150px;
&:last-child {
border-top: 1px solid #eff2f6;
}
.demonstration {
display: block;
color: #8492a6;
font-size: 14px;
margin-bottom: 20px;
}
}
}
}
}
</style>
标签一
标签三
第二标签
尺寸选择
根据size设置大小。
查看代码 < />
<template>
<section class="tabs-demo">
<w-radio-group v-model="size" size="small">
<w-radio-button label="large">大</w-radio-button>
<w-radio-button label="medium">中</w-radio-button>
<w-radio-button label="small">小</w-radio-button>
</w-radio-group>
<div class="container">
<w-tabs v-model="activeName1" @tab-click="handleClick" :size="size">
<w-tab-pane label="标签一" name="1">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="2">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="3">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="4">标签四</w-tab-pane>
</w-tabs>
<w-tabs v-model="activeName2" @tab-click="handleClick" type="card" :size="size">
<w-tab-pane label="标签一" name="5">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="6">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="7">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="8">标签四</w-tab-pane>
</w-tabs>
<w-tabs v-model="activeName3" @tab-click="handleClick" type="border-card" :size="size">
<w-tab-pane label="标签一" name="9">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="10">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="11">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="12">标签四</w-tab-pane>
</w-tabs>
</div>
</section>
</template>
<script>
export default {
data () {
return {
size: 'large',
activeName1: '1',
activeName2: '7',
activeName3: '10'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
}
},
}
</script>
<style scoped lang="scss">
.tabs-demo {
.container {
width: 450px;
margin-top: 30px;
.w-tabs {
margin-bottom: 20px;
}
}
}
</style>
标签一
标签一
卡片式页签
根据card设置卡片式。
查看代码 < />
<template>
<section class="tabs-demo">
<div class="container">
<w-tabs v-model="activeName1" @tab-click="handleClick" type="card">
<w-tab-pane label="标签一" name="first">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="second">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="third">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="fourth">标签四</w-tab-pane>
</w-tabs>
<w-tabs v-model="activeName2" @tab-click="handleClick" type="dark">
<w-tab-pane label="标签一" name="first">标签一</w-tab-pane>
<w-tab-pane label="第二标签" name="second">第二标签</w-tab-pane>
<w-tab-pane label="标签三" name="third">标签三</w-tab-pane>
<w-tab-pane label="标签四" name="fourth">标签四</w-tab-pane>
</w-tabs>
</div>
</section>
</template>
<script>
export default {
data () {
return {
activeName1: 'first',
activeName2: 'first'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
}
},
}
</script>
<style scoped lang="scss">
.tabs-demo {
.container {
width: 450px;
.w-tabs {
margin-bottom: 30px;
}
}
}
</style>
标签二
新增与关闭
增减标签页按钮只能在选项卡样式的标签页下使用。
查看代码 < />
<template>
<section class="tabs-demo">
<w-radio-group v-model="size" size="small">
<w-radio-button label="large">大</w-radio-button>
<w-radio-button label="medium">中</w-radio-button>
<w-radio-button label="small">小</w-radio-button>
</w-radio-group>
<div class="container">
<w-tabs v-model="editableTabsValue" type="card"
editable @edit="handleTabsEdit" :size="size">
<w-tab-pane :key="item.name"
v-for="item in editableTabs"
:label="item.title"
:name="item.name">
{{item.content}}
</w-tab-pane>
</w-tabs>
</div>
</section>
</template>
<script>
export default {
data () {
return {
size: 'large',
editableTabsValue: '2',
editableTabs: [{
title: '标签一',
name: '1',
content: '标签一'
}, {
title: '标签二',
name: '2',
content: '标签二'
}, {
title: '标签三',
name: '3',
content: '标签三'
}, {
title: '标签四',
name: '4',
content: '标签四'
}],
tabIndex: 4
}
},
methods: {
handleTabsEdit(targetName, action) {
if (action === 'add') {
let newTabName = ++this.tabIndex + '';
this.editableTabs.push({
title: '新增 Tab',
name: newTabName,
content: '新增 Tab'
});
this.editableTabsValue = newTabName;
}
if (action === 'remove') {
let tabs = this.editableTabs;
let activeName = this.editableTabsValue;
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.editableTabsValue = activeName;
this.editableTabs = tabs.filter(tab => tab.name !== targetName);
}
}
},
}
</script>
<style scoped lang="scss">
.tabs-demo {
.container {
margin-top: 20px;
}
}
</style>
API
Tabs Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 | Version |
---|---|---|---|---|---|
addable | 标签是否可增加 | Boolean | — | false | |
before-leave | 切换标签之前的钩子,若返回 false 或者返回 Promise 且被 reject,则阻止切换。 | Function(activeName, oldActiveName) | — | — | |
closable | 标签是否可关闭 | Boolean | — | false | |
editable | 标签是否同时可增加和关闭 | Boolean | — | false | |
stretch | 标签的宽度是否自撑开 | Boolean | - | false | |
size | 大小 | String | large/medium/small | medium | |
type | 风格类型 | String | card/border-card/dark | — | |
tab-position | 选项卡所在位置 | String | top/right/bottom/left | top | |
value / v-model | 绑定值,选中选项卡的 name | String | — | 第一个选项卡的 name |
Tabs Events
事件名称 | 说明 | 回调参数 | Version |
---|---|---|---|
edit | 点击 tabs 的新增按钮或 tab 被关闭后触发 | (targetName, action) | |
tab-click | tab 被选中时触发 | 被选中的标签 tab 实例 | |
mouse-right-click | tab 被右键点击时触发 | 被右键点击的标签 tab 实例 | v1.5.11 |
tab-remove | 点击 tab 移除按钮后触发 | 被删除的标签的 name | |
tab-add | 点击 tabs 的新增按钮后触发 | — |
Tab-pane Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 | Version |
---|---|---|---|---|---|
closable | 标签是否可关闭 | Boolean | — | false | |
disabled | 是否禁用 | Boolean | — | false | |
label | 选项卡标题 | String | — | — | |
lazy | 标签是否延迟渲染 | Boolean | — | false | |
name | 与选项卡绑定值 value 对应的标识符,表示选项卡别名 | String | — | 该选项卡在选项卡列表中的顺序值,如第一个选项卡则为'1' |
贡献者
类型 | 参与者 |
---|---|
设计者 | UED视觉组 |
维护者 | UED前端组 |