@qin_sunrise/tab
Version:
A lightweight tab management package based on zustand state management for React applications
258 lines (201 loc) • 6.14 kB
Markdown
# 迁移指南
本指南帮助您从原始的标签页功能迁移到新的 `@qin_sunrise/tab` 包。
## 迁移前(原始实现)
```tsx
// 使用 Redux Toolkit
import { useAppDispatch, useAppSelector } from '@/store';
import {
addTab,
removeTabById,
setActiveTabId,
selectTabs,
selectActiveTabId
} from '@/features/tab/tabStore';
function MyComponent() {
const dispatch = useAppDispatch();
const tabs = useAppSelector(selectTabs);
const activeTabId = useAppSelector(selectActiveTabId);
const handleAddTab = (route) => {
dispatch(addTab(route));
};
const handleRemoveTab = (tabId) => {
dispatch(removeTabById(tabId));
};
}
```
## 迁移后(新的 @qin_sunrise/tab 包)
```tsx
// 使用 Zustand
import { useTabManager, useTabs, useActiveTabId } from '@qin_sunrise/tab';
function MyComponent() {
const { addTab, removeTabById } = useTabManager();
const tabs = useTabs();
const activeTabId = useActiveTabId();
const handleAddTab = (route) => {
addTab(route);
};
const handleRemoveTab = (tabId) => {
removeTabById(tabId);
};
}
```
## 主要变化
### 1. 状态管理
- **迁移前**: 使用 Redux Toolkit 的 `useAppDispatch` 和 `useAppSelector`
- **迁移后**: 使用 Zustand 的直接hooks
### 2. Store 创建
- **迁移前**: Redux store 中的 slices
- **迁移后**: Zustand store 中的 `createTabStore()`
### 3. Hooks
- **迁移前**: 使用 Redux selectors 的自定义 hooks
- **迁移后**: 直接使用 `@qin_sunrise/tab` 的直接hooks
### 4. Actions
- **迁移前**: `dispatch(action())`
- **迁移后**: 直接函数调用
## 迁移步骤
### 步骤 1: 安装新包
```bash
pnpm add @qin_sunrise/tab
```
### 步骤 2: 替换导入
```tsx
// 删除旧的导入
// import { useAppDispatch, useAppSelector } from '@/store';
// import { addTab, removeTabById, selectTabs } from '@/features/tab/tabStore';
// 添加新的导入
import { useTabManager, useTabs, useActiveTabId } from '@qin_sunrise/tab';
```
### 步骤 3: 更新组件逻辑
```tsx
// 迁移前
function MyComponent() {
const dispatch = useAppDispatch();
const tabs = useAppSelector(selectTabs);
const activeTabId = useAppSelector(selectActiveTabId);
const handleAddTab = (route) => {
dispatch(addTab(route));
};
}
// 迁移后
function MyComponent() {
const { addTab } = useTabManager();
const tabs = useTabs();
const activeTabId = useActiveTabId();
const handleAddTab = (route) => {
addTab(route);
};
}
```
### 步骤 4: 更新所有相关组件
#### 标签页管理组件
```tsx
// 迁移前
import { useAppDispatch, useAppSelector } from '@/store';
import {
addTab,
removeTabById,
setActiveTabId,
selectTabs,
selectActiveTabId
} from '@/features/tab/tabStore';
function TabBar() {
const dispatch = useAppDispatch();
const tabs = useAppSelector(selectTabs);
const activeTabId = useAppSelector(selectActiveTabId);
const handleTabClick = (tab) => {
dispatch(setActiveTabId(tab.id));
};
const handleCloseTab = (tabId) => {
dispatch(removeTabById(tabId));
};
}
// 迁移后
import { useTabManager, useTabs, useActiveTabId } from '@qin_sunrise/tab';
function TabBar() {
const { setActiveTabId, removeTabById } = useTabManager();
const tabs = useTabs();
const activeTabId = useActiveTabId();
const handleTabClick = (tab) => {
setActiveTabId(tab.id);
};
const handleCloseTab = (tabId) => {
removeTabById(tabId);
};
}
```
#### 路由集成组件
```tsx
// 迁移前
import { useAppDispatch } from '@/store';
import { addTab } from '@/features/tab/tabStore';
function RouteHandler() {
const dispatch = useAppDispatch();
useEffect(() => {
dispatch(addTab({
id: route.path,
label: route.title,
path: route.path
}));
}, [route]);
}
// 迁移后
import { useTabManager } from '@qin_sunrise/tab';
function RouteHandler() {
const { addTab } = useTabManager();
useEffect(() => {
addTab({
id: route.path,
label: route.title,
path: route.path
});
}, [route]);
}
```
## 功能对比
| 功能 | 迁移前 (Redux) | 迁移后 (Zustand) |
|------|----------------|------------------|
| 添加标签页 | `dispatch(addTab(tab))` | `addTab(tab)` |
| 删除标签页 | `dispatch(removeTabById(id))` | `removeTabById(id)` |
| 激活标签页 | `dispatch(setActiveTabId(id))` | `setActiveTabId(id)` |
| 获取标签页列表 | `useAppSelector(selectTabs)` | `useTabs()` |
| 获取激活标签页 | `useAppSelector(selectActiveTabId)` | `useActiveTabId()` |
| 清理操作 | `dispatch(clearAllTabs())` | `clearAllTabs()` |
## 配置选项
新包支持配置选项:
```tsx
import { createTabStore } from '@qin_sunrise/tab';
const tabStore = createTabStore({
cache: true, // 启用持久化
storageKey: 'my-tabs', // 自定义存储键
homePath: '/dashboard' // 自定义首页路径
});
```
## 注意事项
1. **类型安全**: 新包提供完整的TypeScript支持
2. **性能**: Zustand比Redux更轻量,性能更好
3. **持久化**: 内置localStorage支持,可配置
4. **兼容性**: 保持所有原始功能,API更简洁
## 故障排除
### 常见问题
1. **导入错误**: 确保正确安装了 `@qin_sunrise/tab` 包
2. **类型错误**: 检查TypeScript类型是否正确导入
3. **状态不更新**: 确保使用了正确的hooks
### 调试技巧
```tsx
// 调试状态变化
import { useTabStore } from '@qin_sunrise/tab';
function DebugComponent() {
const store = useTabStore();
useEffect(() => {
console.log('Tab store:', store.getState());
}, [store]);
}
```
## 总结
迁移到 `@qin_sunrise/tab` 包提供了:
- ✅ 更简洁的API
- ✅ 更好的性能
- ✅ 完整的TypeScript支持
- ✅ 内置持久化
- ✅ 更好的开发体验
迁移过程相对简单,主要是替换导入和移除dispatch调用。