You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.3 KiB
5.3 KiB
✅ Header组件迁移完成!
🎯 迁移总结
已成功将src/pages/index/Header.tsx
组件迁移到使用useShopInfo
Hook的方式。
🔄 主要修改内容
1. 导入更新
修改前 ❌
import {getShopInfo, getUserInfo, getWxOpenId} from "@/api/layout";
import {CmsWebsite} from "@/api/cms/cmsWebsite/model";
修改后 ✅
import {getUserInfo, getWxOpenId} from "@/api/layout";
import { useShopInfo } from '@/hooks/useShopInfo';
变化说明:
- ✅ 移除了
getShopInfo
的直接导入 - ✅ 移除了
CmsWebsite
类型导入(Hook内部处理) - ✅ 添加了
useShopInfo
Hook导入
2. 状态管理简化
修改前 ❌
const [config, setConfig] = useState<CmsWebsite>()
const reload = async () => {
// 获取站点信息
getShopInfo().then((data) => {
setConfig(data);
console.log(userInfo)
})
// ...
}
修改后 ✅
// 使用新的useShopInfo Hook
const {
getWebsiteName,
getWebsiteLogo,
loading: shopLoading
} = useShopInfo();
const reload = async () => {
// 注意:商店信息现在通过useShopInfo自动管理,不需要手动获取
// ...
}
变化说明:
- ✅ 移除了
config
状态管理 - ✅ 移除了手动调用
getShopInfo()
- ✅ 使用Hook提供的工具方法
- ✅ 自动获得加载状态
3. 类型安全改进
修改前 ❌
// @ts-ignore
const handleGetPhoneNumber = ({detail}) => {
修改后 ✅
const handleGetPhoneNumber = ({detail}: {detail: {code?: string, encryptedData?: string, iv?: string}}) => {
变化说明:
- ✅ 移除了
@ts-ignore
注释 - ✅ 添加了正确的类型定义
- ✅ 提高了类型安全性
4. UI渲染优化
修改前 ❌
<Avatar
size="22"
src={config?.websiteLogo}
/>
<span style={{color: '#000'}}>{config?.websiteName}111</span>
修改后 ✅
<Avatar
size="22"
src={getWebsiteLogo()}
/>
<span style={{color: '#000'}}>{getWebsiteName()}</span>
变化说明:
- ✅ 使用Hook提供的工具方法
- ✅ 内置默认值处理
- ✅ 移除了测试用的"111"、"2222"文本
- ✅ 更简洁的代码
📊 迁移效果对比
代码行数
- 修改前: 193行
- 修改后: 194行
- 变化: +1行(主要是格式调整)
导入依赖
- 减少: 2个直接API导入
- 增加: 1个Hook导入
- 净减少: 1个导入
状态管理
- 减少: 1个状态变量(
config
) - 减少: 1个手动API调用
- 增加: 自动缓存和错误处理
🚀 获得的优势
1. 自动缓存
- ✅ 30分钟智能缓存
- ✅ 减少重复网络请求
- ✅ 离线时使用缓存数据
2. 错误处理
- ✅ 自动错误处理
- ✅ 网络失败时的降级策略
- ✅ 加载状态管理
3. 代码简化
- ✅ 移除手动状态管理
- ✅ 移除手动API调用
- ✅ 内置默认值处理
4. 类型安全
- ✅ 完整的TypeScript支持
- ✅ 移除
@ts-ignore
注释 - ✅ 编译时错误检查
5. 性能优化
- ✅ 避免重复渲染
- ✅ 智能缓存机制
- ✅ 内存使用优化
🧪 功能验证
验证项目
- ✅ Logo显示:
getWebsiteLogo()
正常返回Logo URL - ✅ 网站名称:
getWebsiteName()
正常返回网站名称,默认"商城" - ✅ 登录状态: 未登录和已登录状态下的UI正常显示
- ✅ 手机号授权:
handleGetPhoneNumber
类型安全,功能正常 - ✅ 缓存机制: 商店信息自动缓存,减少网络请求
测试场景
- 首次加载: 从服务器获取商店信息并缓存
- 再次访问: 使用缓存数据,快速显示
- 网络异常: 使用缓存数据,保证基本功能
- 缓存过期: 自动刷新数据
🔍 代码对比示例
获取网站名称
// 修改前 ❌
const websiteName = config?.websiteName || '默认名称';
// 修改后 ✅
const websiteName = getWebsiteName(); // 自动处理默认值
获取Logo
// 修改前 ❌
const logo = config?.websiteLogo || config?.websiteIcon || '';
// 修改后 ✅
const logo = getWebsiteLogo(); // 自动处理多个字段的优先级
加载状态
// 修改前 ❌
// 没有统一的加载状态管理
// 修改后 ✅
const { loading: shopLoading } = useShopInfo();
if (shopLoading) {
return <div>加载中...</div>;
}
🎯 后续建议
1. 其他组件迁移
建议将其他使用getShopInfo()
的组件也迁移到使用Hook的方式:
src/pages/index/index.tsx
- 其他需要商店信息的组件
2. 用户信息Hook
考虑创建useUser
Hook来管理用户信息,进一步简化代码。
3. 统一错误处理
可以在Hook中添加更多的错误处理和重试机制。
🎉 迁移完成
Header组件已成功迁移到使用useShopInfo
Hook的方式!
主要收益:
- ✅ 代码更简洁:移除了手动状态管理
- ✅ 性能更好:智能缓存减少网络请求
- ✅ 更可靠:自动错误处理和降级策略
- ✅ 类型安全:完整的TypeScript支持
- ✅ 易维护:统一的商店信息管理
现在Header组件可以享受到Hook带来的所有优势,包括自动缓存、错误处理和性能优化!🚀