# SaaS项目自定义钩子使用文档
## 简介
本文档介绍了SaaS项目中的自定义React钩子(Custom Hooks),这些钩子封装了常用的状态管理逻辑,使组件代码更加简洁、可读和可维护。
## 目录结构
```
src/
├── hooks/
│ ├── index.ts # 统一导出所有钩子
│ ├── useUser.ts # 用户相关钩子
│ └── useSettings.ts # 设置相关钩子
└── store/
├── userStore.ts # 用户状态管理
└── settingStore.ts # 设置状态管理
```
## 安装和导入
钩子已集成到项目中,无需额外安装。使用时只需从hooks目录导入:
```tsx
// 导入单个钩子
import { useTheme } from '@/hooks';
// 或导入多个钩子
import { useTheme, useAuth, useUserProfile } from '@/hooks';
```
## 用户相关钩子
### useUserInfo
获取当前登录用户的基本信息。
```tsx
import { useUserInfo } from '@/hooks';
function UserInfoComponent() {
const userInfo = useUserInfo();
return (
用户名: {userInfo?.username}
邮箱: {userInfo?.email}
);
}
```
### useUserProfile
获取格式化后的用户信息,适用于UI显示。
```tsx
import { useUserProfile } from '@/hooks';
function ProfileComponent() {
const profile = useUserProfile();
return (
用户名: {profile.username}
邮箱: {profile.email}
电话: {profile.phone}
角色: {profile.roleName}
);
}
```
### useIsAdmin
检查当前用户是否为管理员。
```tsx
import { useIsAdmin } from '@/hooks';
function AdminSection() {
const isAdmin = useIsAdmin();
if (!isAdmin) {
return 您没有访问此页面的权限
;
}
return 管理员面板内容
;
}
```
### useHasRole
检查当前用户是否拥有特定角色。
```tsx
import { useHasRole } from '@/hooks';
function RoleBasedComponent() {
const hasRole = useHasRole();
return (
{hasRole('editor') && }
{hasRole('admin') && }
);
}
```
### useAuth
管理用户登录状态和认证操作。
```tsx
import { useAuth } from '@/hooks';
function LoginComponent() {
const { isAuthenticated, login, logout } = useAuth();
const handleLogin = async () => {
const response = await fetch('/api/login', { /* 登录请求 */ });
const data = await response.json();
if (data.success) {
login(data.token, data.user);
}
};
return (
{isAuthenticated ? (
) : (
)}
);
}
```
## 设置相关钩子
### useTheme
管理主题模式(亮色/暗色)和相关操作。
```tsx
import { useTheme } from '@/hooks';
function ThemeToggleComponent() {
const {
themeMode,
isDarkMode,
toggleThemeMode,
enableLightMode,
enableDarkMode
} = useTheme();
return (
当前主题: {themeMode}
);
}
```
### useApplyTheme
自动将当前主题应用到DOM。适用于自定义布局组件或页面。
```tsx
import { useApplyTheme } from '@/hooks';
function Layout({ children }) {
// 将当前主题应用到DOM
useApplyTheme();
return (
{children}
);
}
```
### useSettings
获取所有系统设置。
```tsx
import { useSettings } from '@/hooks';
function SettingsComponent() {
const settings = useSettings();
return (
主题模式: {settings.themeMode}
{/* 其他设置项 */}
);
}
```
## 实际使用示例
下面是一个综合使用多个钩子的组件示例:
```tsx
import {
useTheme,
useApplyTheme,
useUserProfile,
useIsAdmin,
useAuth
} from '@/hooks';
function DashboardPage() {
// 应用主题到DOM
useApplyTheme();
// 获取主题状态和操作
const { isDarkMode, toggleThemeMode } = useTheme();
// 获取用户信息和权限
const userProfile = useUserProfile();
const isAdmin = useIsAdmin();
const { isAuthenticated, logout } = useAuth();
if (!isAuthenticated) {
return ;
}
return (
{/* 普通用户内容 */}
{/* 仅管理员可见内容 */}
{isAdmin && }
);
}
```
## 测试页面
项目中包含一个专门的测试页面,用于演示各种钩子的使用方法:
- 路径: `/test/usehook`
- 源代码: `src/app/test/usehook/page.tsx`
在这个页面上可以测试以下功能:
- 主题切换
- 用户登录/登出
- 角色权限检查
- 用户信息显示
## 最佳实践
1. **避免重复导入基础store**:使用自定义钩子而不是直接导入store,减少对底层实现的依赖。
2. **优先使用语义化钩子**:例如使用`useIsAdmin()`而不是`useUserInfo().roleType === 'admin'`。
3. **组合使用多个钩子**:根据需要组合使用不同的钩子,构建复杂功能。
4. **使用useMemo和useCallback**:在性能敏感的场景中,确保不会导致不必要的重新渲染。
## 扩展自定义钩子
如需扩展现有钩子或添加新钩子,请遵循以下步骤:
1. 在适当的文件中添加新钩子(`useUser.ts`或`useSettings.ts`)
2. 在`hooks/index.ts`中导出新钩子
3. 确保包含适当的注释和类型定义
4. 遵循三级注释规范(文件头注释、模块级注释、关键代码行注释)
## 常见问题
**Q: 为什么推荐使用自定义钩子而不是直接使用store?**
A: 自定义钩子提供了更高级别的抽象,隐藏了状态管理的复杂性,使组件代码更加简洁和易于维护。同时,它们可以更轻松地进行单元测试。
**Q: 如何处理钩子之间的依赖关系?**
A: 当一个钩子需要依赖另一个钩子时,应在钩子内部导入并使用依赖的钩子,而不是在组件中手动管理这些依赖关系。
**Q: 如何确保钩子在正确的上下文中使用?**
A: React钩子只能在React函数组件或其他自定义钩子中使用。确保不在类组件、普通函数或条件语句中直接调用钩子。