fix(core): some dnd perf issues (#9661)

1. page list item are bound two draggables. adding `draggable` prop to WorkbenchLink to mitigate the issue.
2. DndService may not resolve datatransfer when dragging.
This commit is contained in:
pengx17
2025-01-15 15:04:01 +00:00
parent b1896746f9
commit 0ed9258f51
5 changed files with 89 additions and 73 deletions

View File

@@ -87,10 +87,16 @@ export const useDraggable = <D extends DNDData = DNDData>(
}, [...deps, context.toExternalData]);
useEffect(() => {
if (!dragRef.current) {
if (
!dragRef.current ||
(typeof options.canDrag === 'boolean' && !options.canDrag)
) {
return;
}
const element = dragRef.current;
const dragHandle = dragHandleRef.current;
const windowEvent = {
dragleave: () => {
setDraggingPosition(state =>
@@ -104,11 +110,11 @@ export const useDraggable = <D extends DNDData = DNDData>(
},
};
dragRef.current.dataset.affineDraggable = 'true';
element.dataset.affineDraggable = 'true';
const cleanupDraggable = draggable({
element: dragRef.current,
dragHandle: dragHandleRef.current ?? undefined,
element,
dragHandle: dragHandle ?? undefined,
canDrag: draggableGet(options.canDrag),
getInitialData: draggableGet(options.data),
getInitialDataForExternal: draggableGet(options.toExternalData),
@@ -130,8 +136,8 @@ export const useDraggable = <D extends DNDData = DNDData>(
if (enableDropTarget.current) {
setDropTarget([]);
}
if (dragRef.current) {
dragRef.current.dataset['dragging'] = 'true';
if (element) {
element.dataset['dragging'] = 'true';
}
options.onDragStart?.(args);
},
@@ -153,8 +159,8 @@ export const useDraggable = <D extends DNDData = DNDData>(
if (enableDropTarget.current) {
setDropTarget([]);
}
if (dragRef.current) {
delete dragRef.current.dataset['dragging'];
if (element) {
delete element.dataset['dragging'];
}
options.onDrop?.(args);
},