fix(title): 拖拽时用ref直接改DOM避免React重渲染导致换行 #1605
Reference in New Issue
Block a user
Delete Branch "fix/title-drag-no-rerender"
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?
问题
标题拖拽时,
handleTitlePointerMove每次 mousemove 都调用onTitlePositionChange,导致 React 频繁重新渲染,标题文字被重新布局,wordBreak: "break-word"触发换行。修复
titleDragRef直接修改 DOM 的style.left/style.top(不触发 React 渲染)handleTitlePointerUp(拖拽结束)时调用onTitlePositionChange保存最终位置ref={titleDragRef}改动文件
apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
handleTitlePointerUp函数中,计算posX和posY时使用了relX / rect.width和relY / rect.height。虽然relX和relY通过Math.min限制在了rect.width/height范围内,但如果rect.width或rect.height为 0(例如容器处于隐藏状态或未渲染出尺寸),将导致除以零,结果为NaN。随后调用onTitlePositionChange(NaN, NaN)会将无效数据传递给父组件,可能导致数据损坏或后续逻辑错误。if (rect.width <= 0 || rect.height <= 0) return;。💡 改进建议(不阻塞合并)
无
✅ 良好实践
useRef配合直接操作 DOM (style.left/top) 来处理拖拽过程中的视觉更新,有效避免了高频触发 React 重渲染,是处理复杂拖拽交互的优秀性能优化实践。setPointerCapture和releasePointerCapture确保了拖拽操作的鲁棒性,防止指针移出目标区域后事件丢失。handleTitlePointerMove使用空数组(仅依赖 Ref),handleTitlePointerUp正确包含了playRes和回调函数。🤖 由 AI 代码审查机器人自动生成 | 2026-09-01 07:01:56 | 模型:
🗑️ 预览环境已清理
PR #1605 已关闭或合并,对应的预览环境已被清理。