Skip to content

useTabs

快速为你的导航定义标签页。

基础用法

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'

const [Tabs] = useTabs({
  tabs: [
    {
      label: 'User',
      name: 'user',
    },
    {
      label: 'Config',
      name: 'config',
    },
    {
      label: 'Role',
      name: 'role',
    },
  ]
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

自定义渲染标签页内容

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'
import { h } from 'vue'

const [Tabs] = useTabs({
  tabs: [
    {
      label: 'User',
      name: 'user',
      render: (item) => {
        return h('div', { class: 'user-content' }, 'User Management Content')
      },
    },
    {
      label: 'Config',
      name: 'config',
      render: (item) => {
        return h('div', { class: 'config-content' }, 'Configuration Content')
      },
    },
  ]
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

自定义渲染标签页标签

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'
import { h } from 'vue'

const [Tabs] = useTabs({
  tabs: [
    {
      label: 'User',
      name: 'user',
      renderLabel: (label) => {
        return h('span', { class: 'custom-label' }, `Custom: ${label}`)
      },
    },
  ]
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

v-model 控制

使用 v-model 控制激活的标签页。

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'

const [Tabs, activeName] = useTabs({
  tabs: [
    { label: 'User', name: 'user' },
    { label: 'Config', name: 'config' },
    { label: 'Role', name: 'role' },
  ],
  defaultActive: 'user',
})

function switchTab(name: string) {
  activeName.value = name
}
</script>

<template>
  <div>
    <Tabs v-model="activeName" />
    <button @click="switchTab('user')">
      User
    </button>
    <button @click="switchTab('config')">
      Config
    </button>
    <button @click="switchTab('role')">
      Role
    </button>
  </div>
</template>

卡片风格标签页

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'

const [Tabs] = useTabs({
  tabs: [
    { label: 'User', name: 'user' },
    { label: 'Config', name: 'config' },
    { label: 'Role', name: 'role' },
  ],
  type: 'card',
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

边框卡片风格

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'

const [Tabs] = useTabs({
  tabs: [
    { label: 'User', name: 'user' },
    { label: 'Config', name: 'config' },
    { label: 'Role', name: 'role' },
  ],
  type: 'border-card',
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

标签页位置

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'

const [Tabs] = useTabs({
  tabs: [
    { label: 'User', name: 'user' },
    { label: 'Config', name: 'config' },
    { label: 'Role', name: 'role' },
  ],
  tabPosition: 'left',
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

异步数据

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'

async function fetchTabs() {
  const res = await fetch('/api/tabs')
  return res.json()
}

function formatData(data: any) {
  return data.map((item: any) => ({
    label: item.label,
    name: item.name,
    closable: item.closable,
  }))
}

const [Tabs] = useTabs({
  tabs: [],
  service: fetchTabs,
  formatData,
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

传递 props 给 ElTabs

向底层的 ElTabs 组件传递额外的 props。

vue
<script setup lang="ts">
import { useTabs } from '@vuecraft/components'

const [Tabs] = useTabs({
  tabs: [
    { label: 'User', name: 'user' },
    { label: 'Config', name: 'config' },
    { label: 'Role', name: 'role' },
  ],
  type: 'card',
  closable: true,
  stretch: true,
})
</script>

<template>
  <div>
    <Tabs />
  </div>
</template>

类型声明

TabsOptions

typescript
interface TabsOptions<T> extends Partial<TabsProps> {
  // @desc Tabs of the component
  tabs: TabsColumn[]
  // @desc Service
  service?: RequestService<T>
  // @desc Service params
  params?: unknown
  // @desc Format tabs data
  formatData?: (data: T) => TabsColumn[]
  // @desc Default active tab name
  defaultActive?: string | number
  // @desc Callback when tab is clicked
  onTabClick?: (tab: TabsPaneContext, event: Event) => void
  // @desc Callback when tab is changed
  onTabChange?: (name: TabPaneName) => void
  // @desc Callback when tab is removed
  onTabRemove?: (name: TabPaneName) => void
  // @desc Callback when tab is added
  onTabAdd?: () => void
  // @desc Callback when tab is edited (add or remove)
  onEdit?: (targetName: TabPaneName | undefined, action: 'remove' | 'add') => void
}

TabsColumn

typescript
interface TabsColumn {
  // Title of the tab
  label?: string
  // Identifier corresponding to the name of Tabs
  name?: string | number
  // Whether Tab is disabled
  disabled?: boolean
  // Whether Tab is closable
  closable?: boolean
  // Whether Tab is lazily rendered
  lazy?: boolean
  // Render function of the tab content
  render?: (val: unknown) => VNode
  // Render function of the tab label
  renderLabel?: (val: unknown) => VNode
}

TabsReturnType

typescript
type TabsReturnType = [
  // Tabs component
  Component,
  // Active tab name ref, can be used to control tab externally
  Ref<string | number>,
]

基于 MIT 许可证发布。