refactor(voice-materials): phase 3 extract hooks #866
Reference in New Issue
Block a user
Delete Branch "refactor/voice-material-library-phase3"
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?
Phase 3 — 抽离业务逻辑 Hook
从 VoiceMaterialLibrary.tsx 中按领域抽离 4 个自定义 Hook,主文件从 ~1100 行降到 ~600 行,专注 UI 渲染组装。
抽离的 Hook
useVoiceMaterialsuseAudioPlayeruseBatchOperationsuseTtsSynthesize变更说明
相关 PR
CI全绿,自动审批通过。
CI全绿,自动审批通过。
77c82285f1to74243f009e代码审查结果 - PR #866
⚠️ 问题(2个需要修改)
apps/web/src/pages/voice-materials/hooks/useAudioPlayer.ts 第99行:使用
setTimeout硬编码 100ms 延迟来设置音频进度,存在竞态条件和不可靠性。handleSeek中,如果音频未初始化,会调用startPlayback并通过setTimeout等待 100ms 后设置currentTime。如果音频加载较慢或浏览器繁忙,100ms 后audioRef.current可能尚未准备好,导致跳转失败或从 0 开始播放。startPlayback中创建Audio对象后立即设置currentTime,或者在canplay事件回调中设置进度,避免使用不可靠的延时。apps/web/src/pages/voice-materials/hooks/useAudioPlayer.ts 第32-131行:事件监听器未清理,存在内存泄漏风险。
startPlayback中为audio对象添加了timeupdate和ended事件监听器,但在stopPlayback和组件卸载的useEffect清理函数中,仅调用了pause()和将引用置空,未调用removeEventListener。Audio对象无法被及时回收,造成内存泄漏。stopPlayback和 cleanup 函数中,显式移除timeupdate和ended事件监听器。💡 建议(1个可选)
timeupdate事件触发频率极高,直接更新 React State 可能导致父组件不必要的频繁重渲染。timeupdate通常每秒触发多次,每次调用setCurrentTime都会触发 Hook 消费者(父组件)重渲染。如果父组件渲染树较重,会造成性能卡顿。requestAnimationFrame节流更新 UI,或者将currentTime存储在 Ref 中,仅通过单独的同步机制或节流回调更新 State。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-25 01:13:22 | 模型:
🗑️ 预览环境已清理
PR #866 已关闭或合并,对应的预览环境已被清理。