MyPageContainer 多标签页功能

基于 Ant Design Pro Components 的企业级多标签页解决方案,提供完整的标签页管理功能。

特性

  • 🎯 多标签页支持 - 支持同时打开多个页面标签
  • 🖱️ 右键菜单 - 丰富的标签页操作菜单
  • 🔄 智能导航 - 关闭标签时自动切换到相邻标签
  • 💾 状态管理 - 全局标签页状态管理
  • 🎨 主题适配 - 完美适配 Ant Design 主题
  • 📱 响应式设计 - 支持不同屏幕尺寸

🚀 快速开始

基础用法

import { MyPageContainer, usePageTabs } from '@/common';

function UserListPage() {
  // 使用 Hook 简化标签页管理
  usePageTabs({
    tabKey: 'user-list',
    tabLabel: '用户列表'
  });

  return (
    <MyPageContainer
      enableTabs
      tabKey="user-list"
      tabLabel="用户列表"
      title="用户管理"
    >
      {/* 页面内容 */}
      <div>用户列表内容</div>
    </MyPageContainer>
  );
}

高级用法

import { MyPageContainer, usePageTabs, tabsManager } from '@/common';
import { Button, Space } from 'antd';
import { history } from '@umijs/max';

function DashboardPage() {
  const tabsApi = usePageTabs({
    tabKey: 'dashboard',
    tabLabel: '仪表盘',
    closable: false // 首页不可关闭
  });

  const openUserPage = () => {
    tabsApi.addTab({
      key: 'user-list',
      label: '用户列表',
      path: '/users'
    });
    history.push('/users');
  };

  return (
    <MyPageContainer
      enableTabs
      tabKey="dashboard"
      tabLabel="仪表盘"
      title="系统仪表盘"
    >
      <Space>
        <Button type="primary" onClick={openUserPage}>
          打开用户列表
        </Button>
        <Button onClick={() => tabsApi.closeOtherTabs()}>
          关闭其他标签
        </Button>
      </Space>
    </MyPageContainer>
  );
}

📚 API 文档

MyPageContainer Props

参数 说明 类型 默认值
enableTabs 是否启用多标签页功能 boolean true
tabKey 标签页唯一标识 string -
tabLabel 标签页显示标题 string -
onTabChange 标签页切换回调 (activeKey: string) => void -
...rest 继承 PageContainerProps 的所有属性 PageContainerProps -

usePageTabs Hook

参数

interface UsePageTabsOptions {
  tabKey: string;        // 标签页唯一标识
  tabLabel: string;      // 标签页显示标题
  closable?: boolean;    // 是否可关闭,默认 true
  autoAdd?: boolean;     // 是否自动添加,默认 true
}

返回值

interface UsePageTabsReturn {
  addTab: (tab: TabItem) => void;           // 添加标签页
  removeTab: (key: string) => void;         // 关闭标签页
  switchTab: (key: string) => void;         // 切换标签页
  closeOtherTabs: (currentKey?: string) => void;  // 关闭其他标签
  closeLeftTabs: (currentKey?: string) => void;   // 关闭左侧标签
  closeRightTabs: (currentKey?: string) => void;  // 关闭右侧标签
  refreshTab: (key?: string) => void;       // 刷新标签页
  getTabs: () => TabItem[];                 // 获取所有标签
  getActiveKey: () => string;               // 获取当前激活标签
}

TabsManager 全局管理器

import { tabsManager } from '@/common';

// 直接操作标签页管理器
tabsManager.addTab({
  key: 'new-page',
  label: '新页面',
  path: '/new-page',
  closable: true
});

// 监听标签页变化
const unsubscribe = tabsManager.subscribe(() => {
  console.log('标签页状态已更新');
});

// 取消监听
unsubscribe();

🎨 样式定制

CSS 变量

// 自定义标签页样式
.tabs-header-only {
  .ant-tabs-tab {
    // 标签页样式
    &:hover {
      background-color: #f5f5f5;
    }
  }
  
  .ant-tabs-tab-active {
    // 激活状态样式
    background-color: #e6f7ff;
  }
}

主题定制

import { ConfigProvider } from 'antd';

<ConfigProvider
  theme={{
    components: {
      Tabs: {
        cardBg: '#ffffff',
        itemActiveColor: '#1890ff',
        itemHoverColor: '#40a9ff'
      }
    }
  }}
>
  <MyPageContainer enableTabs tabKey="page" tabLabel="页面" />
</ConfigProvider>

🔧 最佳实践

1. 标签页命名规范

// ✅ 推荐:使用语义化的 key
usePageTabs({
  tabKey: 'user-list',
  tabLabel: '用户列表'
});

// ❌ 不推荐:使用随机或无意义的 key
usePageTabs({
  tabKey: 'page1',
  tabLabel: '页面1'
});

2. 路由集成

// 在路由配置中使用
export default {
  path: '/users',
  component: () => import('./UserListPage'),
  // 可以在路由元信息中定义标签页信息
  meta: {
    tabKey: 'user-list',
    tabLabel: '用户列表'
  }
};

3. 权限控制

function ProtectedPage() {
  const { hasPermission } = useAccess();
  
  usePageTabs({
    tabKey: 'admin-panel',
    tabLabel: '管理面板',
    // 根据权限决定是否可关闭
    closable: hasPermission('admin')
  });
  
  return (
    <MyPageContainer
      enableTabs
      tabKey="admin-panel"
      tabLabel="管理面板"
    >
      {/* 内容 */}
    </MyPageContainer>
  );
}

4. 性能优化

// 使用 React.memo 优化组件渲染
const OptimizedPage = React.memo(() => {
  usePageTabs({
    tabKey: 'heavy-page',
    tabLabel: '重型页面'
  });
  
  return (
    <MyPageContainer
      enableTabs
      tabKey="heavy-page"
      tabLabel="重型页面"
    >
      {/* 复杂内容 */}
    </MyPageContainer>
  );
});

🐛 常见问题

Q: 标签页不显示?

A: 确保设置了 enableTabs={true} 并提供了 tabKeytabLabel

Q: 右键菜单不工作?

A: 检查是否正确导入了 CSS 样式文件。

Q: 标签页状态丢失?

A: 标签页状态是全局的,但在页面刷新后会重置。如需持久化,可以结合 localStorage 实现。

Q: 如何禁用某些标签页的关闭功能?

A: 在添加标签页时设置 closable: false

🔄 更新日志

v1.0.0

  • 新增多标签页功能
  • 新增右键菜单操作
  • 新增 usePageTabs Hook
  • 新增全局状态管理
  • 🎨 优化样式和交互体验

📄 许可证

MIT License