@qin_sunrise/tab
Version:
A lightweight tab management package based on zustand state management for React applications
266 lines (198 loc) • 5.78 kB
Markdown
# @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