refactor: GeneratePage Phase 2 — 7个Step组件化 + 自定义Hook(2682→485行) #803
Reference in New Issue
Block a user
Delete Branch "refactor/generate-page-phase2"
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?
背景
GeneratePage 巨无霸拆分 Phase 2,将 7 个 Step 全部组件化并抽离对应自定义 Hook。
改动
行数统计
状态划分
原则
Commits (4个)
CI全绿,自动审批通过。
CI全绿,自动审批通过。
Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.
172f90ee41to8c62033101📊 审查概览
❌ 需修改的问题(严重)
[apps/web/src/pages/generate/GeneratePage.tsx: ~131行] 性能回归:
handleCloneSuccess未使用useCallback包裹handleCloneSuccess使用了useCallback进行包裹,依赖项为[addClone]。在重构后的新代码中,该回调函数被定义为普通函数const handleCloneSuccess = ...。由于该函数会被传递给子组件(如CloneModal),每次GeneratePage重新渲染时都会创建一个新的函数引用,导致接收该 prop 的子组件发生不必要的重渲染。useCallback包裹,确保函数引用稳定。[apps/web/src/pages/generate/GeneratePage.tsx: ~13行] 未使用的导入:
getEditPlanimport { getEditPlan } from "@/api/template-editor",但在当前 diff 展示的代码中,getEditPlan原本调用的位置(已被移除的handleGenerate函数)已被删除。loadPlanConfig函数仅解析 URL 参数中的 JSON,并未调用该 API。保留未使用的导入会增加打包体积并降低代码整洁度。getEditPlan是否在其他未展示的代码(如 JSX 或其他 hook)中使用。如果该逻辑已完全迁移至useGenerateVideohook 中,请从GeneratePage.tsx中移除此导入。💡 改进建议(一般)
loadPlanConfig依赖项可能导致重复执行useEffect依赖了[editPlanId, planConfigStr],而loadPlanConfig内部也依赖这两个值。通常建议将loadPlanConfig放在useEffect内部,或者确保useEffect的依赖项与loadPlanConfig的useCallback依赖项完全一致。当前写法虽然逻辑上正确,但若loadPlanConfig被其他地方复用或依赖项变化,可能存在闭包陷阱风险。建议将loadPlanConfig直接定义在useEffect内部以简化逻辑,除非它需要被复用。✅ 良好实践
useState的泛型定义(如useState<"manual" | "auto">("manual")),有助于类型检查。useGenerateVideo和useCloneProgress等自定义 Hook,提高了代码的可维护性和复用性。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-24 09:11:19 | 模型:
🗑️ 预览环境已清理
PR #803 已关闭或合并,对应的预览环境已被清理。