UNPKG

@qin_sunrise/tab

Version:

A lightweight tab management package based on zustand state management for React applications

266 lines (198 loc) 5.78 kB
# @qin_sunrise/tab 一个基于zustand状态管理的轻量级标签页管理包,适用于React应用。 ## 特性 - 🚀 轻量级且快速,基于zustand - 💾 内置持久化支持 - 🎯 TypeScript支持 - 🔧 灵活的配置选项 - 🎨 UI无关 - 仅提供功能,不提供UI组件 - 📦 易于集成 ## 安装 ```bash npm install @qin_sunrise/tab # 或 yarn add @qin_sunrise/tab # 或 pnpm add @qin_sunrise/tab ``` ## 快速开始 ### 基本用法 ```tsx import { useTabManager, useTabs, useActiveTabId } from '@qin_sunrise/tab'; function App() { const { addTab, removeTabById, switchRouteByTab } = useTabManager(); const tabs = useTabs(); const activeTabId = useActiveTabId(); // 添加新标签页 const handleAddTab = (route) => { addTab(route); }; // 删除标签页 const handleRemoveTab = (tabId) => { removeTabById(tabId); }; // 切换到标签页 const handleTabClick = (tab) => { switchRouteByTab(tab); }; return ( <div> {/* 你的标签页UI */} </div> ); } ``` ### 带配置的用法 ```tsx import { createTabStore } from '@qin_sunrise/tab'; // 创建带配置的store const tabStore = createTabStore({ cache: true, // 启用持久化 storageKey: 'my-tabs', // 自定义存储键 homePath: '/dashboard' // 自定义首页路径 }); ``` ## API 参考 ### 类型定义 #### `Tab` ```tsx interface Tab { fixedIndex?: number | null; // 固定索引 fullPath: string; // 完整路径 i18nKey?: string | null; // 国际化键 icon?: string; // 图标 id: string; // 标签页ID keepAlive: boolean; // 是否保持活跃 label: string; // 标签页标题 localIcon?: string; // 本地图标 newLabel?: string; // 新标题 oldLabel?: string | null; // 旧标题 routeKey: string; // 路由键 routePath: string; // 路由路径 } ``` #### `TabConfig` ```tsx interface TabConfig { cache?: boolean; // 是否启用缓存 storageKey?: string; // 存储键名 homePath?: string; // 首页路径 } ``` ### Hooks #### `useTabStore(config?)` 获取标签页store实例。 #### `useTabs()` 获取所有标签页。 #### `useActiveTabId()` 获取当前激活的标签页ID。 #### `useActiveFirstLevelMenuKey()` 获取激活的一级菜单键。 #### `useRemoveCacheKey()` 获取移除缓存键。 #### `useTabActions()` 获取所有标签页操作函数。 #### `useTabManager(navigate?)` 获取带导航支持的标签页管理器。 #### `useCacheTabs()` 自动在页面卸载前缓存标签页的hook。 #### `useTabScroll()` 获取标签页滚动工具。 ### Store 操作 #### `addTab(tab: Tab)` 向store添加新标签页。 #### `updateTab(index: number, tab: Tab)` 更新指定索引的标签页。 #### `setActiveTabId(tabId: string)` 设置激活的标签页ID。 #### `setActiveFirstLevelMenuKey(key: string)` 设置激活的一级菜单键。 #### `setTabs(tabs: Tab[])` 设置所有标签页。 #### `changeTabLabel(index: number, label?: string)` 更改标签页标题。 #### `removeTabById(tabId: string)` 根据ID移除标签页。 #### `clearAllTabs()` 清除除固定标签页外的所有标签页。 #### `clearLeftTabs(tabId: string)` 清除指定标签页左侧的标签页。 #### `clearRightTabs(tabId: string)` 清除指定标签页右侧的标签页。 #### `clearOtherTabs(tabId: string)` 清除除指定标签页和固定标签页外的所有标签页。 #### `setRemoveCacheKey(keys: string[] | null)` 设置移除缓存键。 ### 工具函数 #### `getTabByRoute(route: Route, homePath?: string)` 将路由转换为标签页对象。 #### `isTabInTabs(tabId: string, tabs: Tab[])` 检查标签页是否存在于标签页数组中。 #### `getFixedTabs(tabs: Tab[])` 获取所有固定标签页。 #### `getTabById(tabId: string, tabs: Tab[])` 根据ID获取标签页。 #### `isTabRetain(tabId: string, tabs: Tab[])` 检查标签页是否为保留(固定)标签页。 #### `getActiveFirstLevelMenuKey(route: Route)` 从路由获取激活的一级菜单键。 ## 示例 ### 基本标签页管理 ```tsx import { useTabManager, useTabs } from '@qin_sunrise/tab'; function TabBar() { const { addTab, removeTabById, switchRouteByTab } = useTabManager(); const tabs = useTabs(); return ( <div className="tab-bar"> {tabs.map((tab) => ( <div key={tab.id} className="tab" onClick={() => switchRouteByTab(tab)}> <span>{tab.label}</span> <button onClick={() => removeTabById(tab.id)}>×</button> </div> ))} </div> ); } ``` ### 与路由集成 ```tsx import { useTabManager } from '@qin_sunrise/tab'; import { useRouter } from 'your-router'; function App() { const router = useRouter(); const { addTab } = useTabManager(router.navigate); // 路由变化时添加标签页 useEffect(() => { addTab({ fullPath: router.pathname, pathname: router.pathname, id: router.route, handle: { title: router.route, keepAlive: true } }); }, [router.pathname]); return <YourApp />; } ``` ### 带持久化 ```tsx import { createTabStore } from '@qin_sunrise/tab'; const tabStore = createTabStore({ cache: true, storageKey: 'my-app-tabs' }); function App() { return ( <TabProvider store={tabStore}> <YourApp /> </TabProvider> ); } ``` ## 迁移指南 如果你正在从Redux Toolkit迁移到本包,请参考 [MIGRATION.md](./MIGRATION.md) 获取详细的迁移步骤。 ## 许可证 MIT