Реагируйте на выступления DnD со многими целями сбрасывания - PullRequest
0 голосов
/ 10 января 2020

Я потратил несколько дней, пытаясь понять, почему в некоторых случаях перетаскивание (с React DnD) происходит так медленно в моем приложении React.

Точнее говоря, проблема не в том, когда Я перетаскиваю элемент, но когда начинаю его перетаскивать: я щелкаю и обрабатываю щелчок по элементу и перемещаю курсор, и может пройти до 10 секунд, прежде чем элемент появится под моим курсором. Само перетаскивание немного запаздывает, но приемлемо, здесь проблема не в этом.

Я наконец-то обнаружил, что он становится медленнее с увеличением числа целей сбрасывания. Например, у меня может быть 50 компонентов на экране, каждый из которых представляет собой не одну, а две цели перетаскивания, потому что я рассматриваю это как «верхнюю цель перетаскивания» и «нижнюю цель перетаскивания», так что вы можете опустить свой элемент выше или ниже его. в зависимости от того, где находится ваш курсор. Просто удалив одну из этих возможностей, производительность резко возросла.

Я предполагаю, что эта проблема связана с тем, что когда я начинаю перетаскивать, слой DnD ищет все компоненты, которые являются возможными объектами удаления и ... что-то делать с ними (с помощью функции connect.dropTarget ()).

Есть ли способ избежать этого или это причина, по которой работает DnD? Например, могу ли я определить опущенные цели, когда они наведены, вместо загрузки их всех, когда я начинаю перетаскивать элемент? Мне все еще нужно будет изменить их стиль, например, когда они будут зависать.

Кстати, я все еще использую устаревший API-интерфейс декоратора, улучшит ли новый API-интерфейс ловушек производительность?

Спасибо .

1 Ответ

0 голосов
/ 19 апреля 2020

Я наконец-то обнаружил, что он становится медленнее с увеличением количества целей, с которыми падает.

Когда я начал использовать react-dnd, это была и моя первая идея: иметь отдельная цель падения для каждой позиции падения. Как и у вас, я обнаружил, что у этого есть существенные проблемы с производительностью.

Я понял, что мне действительно нужна только одна цель, покрывающая большую часть экрана. Когда предмет отбрасывается, вы можете просто вычислить, где предмет был отброшен с помощью цели сброса, используя такие функции монитора, как DropTargetMonitor#getClientOffset(). Если вам нужно конкретное позиционирование отброшенного элемента, вы можете легко привязать его к ближайшему кратному размеру предпочитаемого вами размера сетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...