5.6.9 • Published 4 months ago

@cimom/vben-core-tabs-ui v5.6.9

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

Tabs UI 组件

Tabs UI 组件是一个基于 Vue 3 的标签页组件,提供了丰富的配置选项,支持拖拽排序、滚轮滚动、右键菜单等功能,适用于各种标签页导航场景。

安装

npm install @cimom/vben-core-ui-kit-tabs-ui

基本使用

<script setup lang="ts">
import { TabsView } from '@cimom/vben-core-ui-kit-tabs-ui';
import { ref } from 'vue';

const activeTab = ref('tab1');
const tabs = ref([
  { key: 'tab1', title: '标签页1', closable: true },
  { key: 'tab2', title: '标签页2', closable: true },
  { key: 'tab3', title: '标签页3', closable: true },
]);

const handleClose = (key: string) => {
  const index = tabs.value.findIndex((item) => item.key === key);
  if (index !== -1) {
    tabs.value.splice(index, 1);
    if (activeTab.value === key && tabs.value.length) {
      activeTab.value = tabs.value[index - 1 >= 0 ? index - 1 : 0].key;
    }
  }
};
</script>

<template>
  <div class="h-10">
    <TabsView v-model:active="activeTab" :tabs="tabs" @close="handleClose" />
  </div>

  <div class="p-4">
    <div v-if="activeTab === 'tab1'">标签页1的内容</div>
    <div v-if="activeTab === 'tab2'">标签页2的内容</div>
    <div v-if="activeTab === 'tab3'">标签页3的内容</div>
  </div>
</template>

组件属性

TabsView Props

属性名类型默认值说明
activestring-当前激活的标签页 key
tabsTabDefinition[][]标签页数据
styleType'chrome' \| 'default''chrome'标签页风格
draggablebooleantrue是否可以拖拽排序
wheelablebooleantrue是否响应滚轮事件
contentClassstring'vben-tabs-content'内容区域的类名
showIconboolean-是否显示图标
middleClickToCloseboolean-是否允许鼠标中键点击关闭标签页
contextMenus(data: any) => IContextMenuItem[]-右键菜单配置函数
gapnumber7标签页之间的间隙(仅 chrome 风格有效)
minWidthnumber-标签页最小宽度(仅 chrome 风格有效)
maxWidthnumber-标签页最大宽度(仅 chrome 风格有效)

TabDefinition 标签页配置

属性名类型说明
keystring标签页唯一标识
titlestring标签页标题
iconstring标签页图标
closableboolean是否可关闭
affixTabboolean是否固定标签(不可关闭)

事件

事件名参数说明
update:active(key: string) => void激活标签页变化时触发
close(key: string) => void关闭标签页时触发
sortTabs(oldIndex: number, newIndex: number) => void拖拽排序标签页时触发
unpin(tab: TabDefinition) => void取消固定标签页时触发

标签页风格

Tabs UI 组件支持两种标签页风格:

  • 'chrome': Chrome 浏览器风格的标签页(默认)
  • 'default': 普通风格的标签页
<template>
  <TabsView v-model:active="activeTab" :tabs="tabs" styleType="chrome" />
</template>

拖拽排序

Tabs UI 组件默认支持拖拽排序功能,可以通过 draggable 属性控制是否启用:

<template>
  <TabsView
    v-model:active="activeTab"
    :tabs="tabs"
    :draggable="true"
    @sortTabs="handleSortTabs"
  />
</template>

<script setup>
const handleSortTabs = (oldIndex, newIndex) => {
  // 处理标签页排序逻辑
  const tab = tabs.value.splice(oldIndex, 1)[0];
  tabs.value.splice(newIndex, 0, tab);
};
</script>

右键菜单

Tabs UI 组件支持自定义右键菜单,可以通过 contextMenus 属性配置:

<template>
  <TabsView
    v-model:active="activeTab"
    :tabs="tabs"
    :contextMenus="getContextMenus"
  />
</template>

<script setup>
const getContextMenus = (tab) => {
  return [
    {
      label: '刷新',
      onClick: () => {
        console.log('刷新标签页:', tab);
      },
    },
    {
      label: '关闭',
      onClick: () => {
        handleClose(tab.key);
      },
      disabled: !tab.closable,
    },
    {
      label: '关闭其他',
      onClick: () => {
        tabs.value = tabs.value.filter(
          (item) => item.key === tab.key || !item.closable,
        );
      },
    },
    {
      label: '关闭所有',
      onClick: () => {
        tabs.value = tabs.value.filter((item) => !item.closable);
      },
    },
  ];
};
</script>

示例

带图标的标签页

<template>
  <div class="h-10">
    <TabsView
      v-model:active="activeTab"
      :tabs="tabs"
      :showIcon="true"
      @close="handleClose"
    />
  </div>

  <div class="p-4">
    <component :is="activeComponent" />
  </div>
</template>

<script setup lang="ts">
import { TabsView } from '@cimom/vben-core-ui-kit-tabs-ui';
import { computed, ref, shallowRef } from 'vue';
import DashboardView from './views/Dashboard.vue';
import UserView from './views/User.vue';
import SettingView from './views/Setting.vue';

const activeTab = ref('dashboard');
const tabs = ref([
  {
    key: 'dashboard',
    title: '仪表盘',
    icon: 'Dashboard',
    closable: false,
    affixTab: true,
  },
  {
    key: 'user',
    title: '用户管理',
    icon: 'User',
    closable: true,
  },
  {
    key: 'setting',
    title: '系统设置',
    icon: 'Setting',
    closable: true,
  },
]);

const componentMap = {
  dashboard: DashboardView,
  user: UserView,
  setting: SettingView,
};

const activeComponent = computed(() => {
  return componentMap[activeTab.value] || null;
});

const handleClose = (key: string) => {
  const index = tabs.value.findIndex((item) => item.key === key);
  if (index !== -1) {
    tabs.value.splice(index, 1);
    if (activeTab.value === key && tabs.value.length) {
      activeTab.value = tabs.value[index - 1 >= 0 ? index - 1 : 0].key;
    }
  }
};
</script>

动态添加标签页

<template>
  <div class="mb-4">
    <button
      class="mr-2 rounded bg-blue-500 px-4 py-2 text-white"
      @click="addTab"
    >
      添加标签页
    </button>
  </div>

  <div class="h-10">
    <TabsView
      v-model:active="activeTab"
      :tabs="tabs"
      styleType="chrome"
      @close="handleClose"
    />
  </div>

  <div class="mt-2 rounded border p-4">
    <div>当前激活的标签页: {{ activeTab }}</div>
    <div>标签页数量: {{ tabs.length }}</div>
  </div>
</template>

<script setup lang="ts">
import { TabsView } from '@cimom/vben-core-ui-kit-tabs-ui';
import { ref } from 'vue';

const activeTab = ref('tab1');
const tabs = ref([{ key: 'tab1', title: '标签页1', closable: true }]);

let tabIndex = 1;

const addTab = () => {
  tabIndex++;
  const newTab = {
    key: `tab${tabIndex}`,
    title: `标签页${tabIndex}`,
    closable: true,
  };
  tabs.value.push(newTab);
  activeTab.value = newTab.key;
};

const handleClose = (key: string) => {
  const index = tabs.value.findIndex((item) => item.key === key);
  if (index !== -1) {
    tabs.value.splice(index, 1);
    if (activeTab.value === key && tabs.value.length) {
      activeTab.value = tabs.value[index - 1 >= 0 ? index - 1 : 0].key;
    }
  }
};
</script>

固定标签页

<template>
  <div class="h-10">
    <TabsView
      v-model:active="activeTab"
      :tabs="tabs"
      styleType="chrome"
      @close="handleClose"
    />
  </div>
</template>

<script setup lang="ts">
import { TabsView } from '@cimom/vben-core-ui-kit-tabs-ui';
import { ref } from 'vue';

const activeTab = ref('home');
const tabs = ref([
  { key: 'home', title: '首页', closable: false, affixTab: true },
  { key: 'dashboard', title: '仪表盘', closable: false, affixTab: true },
  { key: 'user', title: '用户管理', closable: true },
  { key: 'role', title: '角色管理', closable: true },
]);

const handleClose = (key: string) => {
  const index = tabs.value.findIndex((item) => item.key === key);
  if (index !== -1) {
    tabs.value.splice(index, 1);
    if (activeTab.value === key && tabs.value.length) {
      activeTab.value = tabs.value[index - 1 >= 0 ? index - 1 : 0].key;
    }
  }
};
</script>
5.6.9

4 months ago

5.6.8

4 months ago

5.6.3

4 months ago

5.6.2

4 months ago

5.6.1

4 months ago

5.6.0

4 months ago

5.5.14

5 months ago

5.5.13

5 months ago

5.5.12

5 months ago

5.5.9

5 months ago