refactor(products): 拆分 useProductList 为3个子Hook(202→91行, -55%) #1155
Reference in New Issue
Block a user
Delete Branch "refactor/product-list-hook"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
变更内容
将
useProductList.ts(202行)拆分为目录结构,按职责分离:文件变化
hooks/useProductList.ts(202行)hooks/useProductList/index.ts(91行)hooks/useProductList/useProductFiltering.ts(127行)hooks/useProductList/useBatchSelection.ts(42行)test/pages/products/smoke.test.tsx+子模块导入兼容性
@/pages/products/hooks/useProductList保持不变(目录解析到 index.ts)Filters类型从 index.ts re-export,保持向后兼容🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[apps/web/src/pages/products/hooks/useProductList/useBatchSelection.ts: 11] 性能优化:allSelected 计算建议使用 useMemo
allSelected是一个直接计算的派生状态,在组件每次渲染时都会执行filteredProducts.every遍历。如果产品列表较长,这会造成不必要的计算开销。建议使用useMemo包裹,依赖项为[selectedIds, filteredProducts]。[apps/web/src/pages/products/hooks/useProductList/useProductFiltering.ts: 40] 潜在的空指针异常风险
p.name.toLowerCase()。如果ProductItem中的name字段为null或undefined,这将导致运行时报错。尽管这是重构代码,但建议增加防御性判断,如p.name?.toLowerCase() ?? ""。[apps/web/src/pages/products/hooks/useProductList/index.ts: 22] 日期解析的健壮性
new Date(b.date).getTime()假设日期字符串是有效的。如果date是无效格式(既不是空也不是 "—"),getTime()将返回NaN,导致排序结果不稳定。建议增加对isNaN的检查,确保无效日期被统一处理。✅ 良好实践
useProductList拆分为useProductFiltering和useBatchSelection,逻辑清晰,易于维护。Set<string>管理选中 ID,查找和删除操作的时间复杂度为 O(1),性能优于数组。handleSelectAll实现了在筛选状态下“全选/反选”时保留筛选外选中项的逻辑,符合复杂列表操作的用户体验预期。index.ts中对apiProducts进行了数组类型检查,防止非数组数据导致的崩溃。🤖 由 AI 代码审查机器人自动生成 | 2026-07-29 17:04:03 | 模型:
🗑️ 预览环境已清理
PR #1155 已关闭或合并,对应的预览环境已被清理。