Tabs 标签 
分隔内容上有关联但属于不同类别的数据集合。
基础用法 
标签页的基本使用方法。
 标签页内容 1 
 标签页内容 2 
 标签页内容 3 
<template>
  <tu-tabs :default-active-key="1">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template><template>
  <tu-tabs :default-active-key="1">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>带图标的标签 
通过 title 插槽来实现自定义标签页的内容。
 标签页内容 1 
 标签页内容 2 
 标签页内容 3 
<template>
  <tu-tabs :default-active-key="1">
    <tu-tab-pane :key="1">
      <template #title>
        <tu-icon><Apple /></tu-icon>
        标签1
      </template>
      标签页内容 1
    </tu-tab-pane>
    <tu-tab-pane :key="2">
      <template #title>
        <tu-icon> <Grape /></tu-icon>
        标签2
      </template>
      标签页内容 2
    </tu-tab-pane>
    <tu-tab-pane :key="3">
      <template #title>
        <tu-icon> <Pear /></tu-icon>
        标签3
      </template>
      标签页内容 3
    </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { Apple, Grape, Pear } from '@tu-view-plus/icons-vue';
</script>
<style scoped>
.tu-icon {
  margin-right: 4px;
}
</style><template>
  <tu-tabs :default-active-key="1">
    <tu-tab-pane :key="1">
      <template #title>
        <tu-icon><Apple /></tu-icon>
        标签1
      </template>
      标签页内容 1
    </tu-tab-pane>
    <tu-tab-pane :key="2">
      <template #title>
        <tu-icon> <Grape /></tu-icon>
        标签2
      </template>
      标签页内容 2
    </tu-tab-pane>
    <tu-tab-pane :key="3">
      <template #title>
        <tu-icon> <Pear /></tu-icon>
        标签3
      </template>
      标签页内容 3
    </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { Apple, Grape, Pear } from '@tu-view-plus/icons-vue';
</script>
<style scoped>
.tu-icon {
  margin-right: 4px;
}
</style>标签页的位置 
通过 position 属性可以自定义标签栏的位置。
 标签页内容 1 
 标签页内容 2 
 标签页内容 3 
<template>
  <tu-radio-group class="mb-2" v-model="tabPositon" type="button">
    <tu-radio label="top">上方</tu-radio>
    <tu-radio label="left">左方</tu-radio>
    <tu-radio label="right">右方</tu-radio>
    <tu-radio label="bottom">下方</tu-radio>
  </tu-radio-group>
  <tu-tabs :default-active-key="1" :position="tabPositon" style="height: 146px">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const tabPositon = ref('top');
</script><template>
  <tu-radio-group class="mb-2" v-model="tabPositon" type="button">
    <tu-radio label="top">上方</tu-radio>
    <tu-radio label="left">左方</tu-radio>
    <tu-radio label="right">右方</tu-radio>
    <tu-radio label="bottom">下方</tu-radio>
  </tu-radio-group>
  <tu-tabs :default-active-key="1" :position="tabPositon" style="height: 146px">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const tabPositon = ref('top');
</script>不同类型 
通过 type 可以设置标签的类型。
 标签页内容 1 
 标签页内容 2 
 标签页内容 3 
<template>
  <tu-radio-group class="mb-2" v-model="tabType" type="button" size="small">
    <tu-radio label="default">默认</tu-radio>
    <tu-radio label="flat">扁平</tu-radio>
    <tu-radio label="card-outset">上方卡片</tu-radio>
    <tu-radio label="card-inset">下方卡片</tu-radio>
    <tu-radio label="slider-outset">上方滑动</tu-radio>
    <tu-radio label="slider-inset">下方滑动</tu-radio>
    <tu-radio label="text">文字</tu-radio>
    <tu-radio label="button">按钮</tu-radio>
    <tu-radio label="button-round">圆形按钮</tu-radio>
  </tu-radio-group>
  <tu-tabs :default-active-key="1" :type="tabType" style="height: 130px">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const tabType = ref('default');
</script><template>
  <tu-radio-group class="mb-2" v-model="tabType" type="button" size="small">
    <tu-radio label="default">默认</tu-radio>
    <tu-radio label="flat">扁平</tu-radio>
    <tu-radio label="card-outset">上方卡片</tu-radio>
    <tu-radio label="card-inset">下方卡片</tu-radio>
    <tu-radio label="slider-outset">上方滑动</tu-radio>
    <tu-radio label="slider-inset">下方滑动</tu-radio>
    <tu-radio label="text">文字</tu-radio>
    <tu-radio label="button">按钮</tu-radio>
    <tu-radio label="button-round">圆形按钮</tu-radio>
  </tu-radio-group>
  <tu-tabs :default-active-key="1" :type="tabType" style="height: 130px">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const tabType = ref('default');
</script>懒加载 
通过设置 lazy-load 属性,可以让面板在首次激活时渲染。
 标签页内容 1 
<template>
  <tu-tabs :default-active-key="1" :lazy-load="true">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template><template>
  <tu-tabs :default-active-key="1" :lazy-load="true">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>附加内容 
通过 extra 插槽可以自定义额外显示内容。
 标签页内容 1 
 标签页内容 2 
 标签页内容 3 
<template>
  <tu-tabs :default-active-key="1">
    <template #extra>
      <tu-button size="mini">添加</tu-button>
    </template>
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template><template>
  <tu-tabs :default-active-key="1">
    <template #extra>
      <tu-button size="mini">添加</tu-button>
    </template>
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>动态增减标签页 
通过设置 editable 为 true 可以开启动态增减标签页。
标签页内容 1
标签页内容 2
标签页内容 3
标签页内容 4
<template>
  <tu-radio-group class="mb-2" v-model="tabType" type="button" size="small">
    <tu-radio label="default">默认</tu-radio>
    <tu-radio label="flat">扁平</tu-radio>
    <tu-radio label="card-outset">上方卡片</tu-radio>
    <tu-radio label="card-inset">下方卡片</tu-radio>
    <tu-radio label="slider-outset">上方滑动</tu-radio>
    <tu-radio label="slider-inset">下方滑动</tu-radio>
    <tu-radio label="text">文字</tu-radio>
    <tu-radio label="button">按钮</tu-radio>
    <tu-radio label="button-round">圆形按钮</tu-radio>
  </tu-radio-group>
  <tu-tabs
    v-model="tabValue"
    :type="tabType"
    editable
    show-add-button
    auto-switch
    @add="handleAdd"
    @delete="handleDelete"
  >
    <tu-tab-pane
      v-for="(item, index) in tabData"
      :key="item.key"
      :title="`标签${item.key}`"
      :closable="index !== 0"
    >
      {{ `标签页内容 ${item.key}` }}
    </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const tabType = ref('default');
const tabData = ref([{ key: 1 }, { key: 2 }, { key: 3 }, { key: 4 }]);
const tabValue = ref(1);
const handleAdd = () => {
  const count = tabData.value.length + 1;
  tabData.value = [...tabData.value, { key: count }];
};
const handleDelete = (key: number) => {
  if (key === tabValue.value) {
    const targetIndex = tabData.value.findIndex((i) => i.key === key);
    tabValue.value = tabData.value[targetIndex - 1].key;
  }
  tabData.value = tabData.value.filter((i) => i.key !== key);
};
</script><template>
  <tu-radio-group class="mb-2" v-model="tabType" type="button" size="small">
    <tu-radio label="default">默认</tu-radio>
    <tu-radio label="flat">扁平</tu-radio>
    <tu-radio label="card-outset">上方卡片</tu-radio>
    <tu-radio label="card-inset">下方卡片</tu-radio>
    <tu-radio label="slider-outset">上方滑动</tu-radio>
    <tu-radio label="slider-inset">下方滑动</tu-radio>
    <tu-radio label="text">文字</tu-radio>
    <tu-radio label="button">按钮</tu-radio>
    <tu-radio label="button-round">圆形按钮</tu-radio>
  </tu-radio-group>
  <tu-tabs
    v-model="tabValue"
    :type="tabType"
    editable
    show-add-button
    auto-switch
    @add="handleAdd"
    @delete="handleDelete"
  >
    <tu-tab-pane
      v-for="(item, index) in tabData"
      :key="item.key"
      :title="`标签${item.key}`"
      :closable="index !== 0"
    >
      {{ `标签页内容 ${item.key}` }}
    </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const tabType = ref('default');
const tabData = ref([{ key: 1 }, { key: 2 }, { key: 3 }, { key: 4 }]);
const tabValue = ref(1);
const handleAdd = () => {
  const count = tabData.value.length + 1;
  tabData.value = [...tabData.value, { key: count }];
};
const handleDelete = (key: number) => {
  if (key === tabValue.value) {
    const targetIndex = tabData.value.findIndex((i) => i.key === key);
    tabValue.value = tabData.value[targetIndex - 1].key;
  }
  tabData.value = tabData.value.filter((i) => i.key !== key);
};
</script>触发方式 
通过 trigger 指定触发方式。
 标签页内容 1 
 标签页内容 2 
 标签页内容 3 
<template>
  <tu-radio-group class="mb-2" v-model="trigger" type="button">
    <tu-radio label="click">点击</tu-radio>
    <tu-radio label="hover">悬停</tu-radio>
  </tu-radio-group>
  <tu-tabs :default-active-key="1" :trigger="trigger">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const trigger = ref('click');
</script><template>
  <tu-radio-group class="mb-2" v-model="trigger" type="button">
    <tu-radio label="click">点击</tu-radio>
    <tu-radio label="hover">悬停</tu-radio>
  </tu-radio-group>
  <tu-tabs :default-active-key="1" :trigger="trigger">
    <tu-tab-pane :key="1" title="标签1"> 标签页内容 1 </tu-tab-pane>
    <tu-tab-pane :key="2" title="标签2"> 标签页内容 2 </tu-tab-pane>
    <tu-tab-pane :key="3" title="标签3"> 标签页内容 3 </tu-tab-pane>
  </tu-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const trigger = ref('click');
</script>Tabs API 
Tabs Attributes 
| 参数名 | 描述 | 类型 | 默认值 | 
|---|---|---|---|
| active-key/v-model | 当前选中的标签的 key | String Number | - | 
| default-active-key | 默认选中的标签的 key(非受控状态,为空时选中第一个标签页) | String Number | - | 
| position | 标签页的位置 | String | top | 
| type | 标签页的类型 | String | default | 
| direction | 标签页的方向 | String | horizontal | 
| editable | 是否开启可编辑模式 | Boolean | false | 
| show-add-button | 是否显示增加按钮(仅在可编辑模式可用) | Boolean | false | 
| destroy-on-hide | 是否在不显示标签时销毁内容 | Boolean | false | 
| lazy-load | 是否在首次展示标签时挂载内容 | Boolean | false | 
| justify | 高度撑满容器,只在水平模式下生效。 | Boolean | false | 
| animation | 是否开启选项内容过渡动画 | Boolean | false | 
| header-padding | 标签页头部是否存在水平边距。 | Boolean | true | 
| auto-switch | 创建标签后是否切换到新标签(最后一个) | Boolean | false | 
| hide-content | 是否隐藏内容 | Boolean | false | 
| trigger | 触发方式 | String | click | 
Tabs Events 
| 事件名 | 描述 | 参数 | 
|---|---|---|
| change | 当前标签值改变时触发 | Function | 
| tab-click | 用户点击标签时触发 | Function | 
| add | 用户点击增加按钮时触发 | - | 
| delete | 用户点击删除按钮时触发 | Function | 
Tabs Slots 
| 参数名 | 描述 | 
|---|---|
| extra | 标签页额外内容 | 
Tab-Pane API 
Tab-Pane Attributes 
| 参数名 | 描述 | 类型 | 默认值 | 
|---|---|---|---|
| title | 选项卡的标题 | String | - | 
| disabled | 是否禁用 | Boolean | false | 
| closable | 是否允许关闭此选项卡(仅在可编辑模式生效) | Boolean | true | 
| destroy-on-hide | 是否在不显示标签时销毁内容 | Boolean | false | 
Tab-Pane Slots 
| 参数名 | 描述 | 
|---|---|
| title | 选项卡标题 |