问题描述
我在一个项目中使用 React 和 TypeScript,最近拼凑了以下钩子:
export const useDrag = (selectionRef: React.MutableRefObject<HTMLdivelement>) => {
const [dragStart,setDragStart] = useState<Coordinates>(null);
const [dragEnd,setDragEnd] = useState<Coordinates>(null);
const onMouseDown = (e: MouseEvent) => setDragStart(getMouSEOffset(e,selectionRef.current));
const onmouseup = () => {
setDragStart(null);
setDragEnd(null);
};
const onMouseMove = (e: any) => {
if (dragStart) {
setDragEnd(getMouSEOffset(e,selectionRef.current));
}
};
useEffect(() => {
const current = selectionRef.current;
if (current) {
current.addEventListener('mousedown',onMouseDown);
current.addEventListener('mouseup',onmouseup);
current.addEventListener('mousemove',onMouseMove);
return () => {
current.removeEventListener('mousedown',onMouseDown);
current.removeEventListener('mouseup',onmouseup);
current.removeEventListener('mousemove',onMouseMove);
};
}
},[selectionRef,dragStart]);
return {
pendingSelection: dragStart && dragEnd && { start: dragStart,end: dragEnd },};
};
这几乎按预期工作。问题是当我在另一个组件中使用这个钩子时:
...
const selectionRef = useRef<HTMLdivelement>();
const { pendingSelection } = useDrag(selectionRef);
return (
<div className="selection" ref={selectionRef}></div>
{pendingSelection && (
<div
style={{
height: pendingSelection.end.y - pendingSelection.start.y,width: pendingSelection.end.x - pendingSelection.start.x,}}
></div>
);
...
似乎 'mousemove' 事件发生得如此频繁,以至于实际上减慢了渲染过程(以至于暂时冻结了页面)。
我见过处理拖拽事件的 React 包,更新非常流畅。我知道我可以切换到其中之一,但真的更想了解我在这里做错了什么,并避免对如此小的用例产生依赖性。
很乐意提供更多代码或工作示例。任何信息表示赞赏!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)