时里院子市集
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

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类型安全,功能正常
  • 缓存机制: 商店信息自动缓存,减少网络请求

测试场景

  1. 首次加载: 从服务器获取商店信息并缓存
  2. 再次访问: 使用缓存数据,快速显示
  3. 网络异常: 使用缓存数据,保证基本功能
  4. 缓存过期: 自动刷新数据

🔍 代码对比示例

获取网站名称

// 修改前 ❌
const websiteName = config?.websiteName || '默认名称';

// 修改后 ✅  
const websiteName = getWebsiteName(); // 自动处理默认值
// 修改前 ❌
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带来的所有优势,包括自动缓存、错误处理和性能优化!🚀