React DND, добавление размеров элемента в DragSource

#javascript #reactjs #typescript #react-dnd

#javascript #reactjs #typescript #react-dnd

Вопрос:

У меня есть несколько html-элементов, к которым я хочу добавить функции перетаскивания. Я использую useDragLayer хук для создания предварительного просмотра перетаскивания для элементов. Эти элементы получают свою ширину из гибкого контейнера, поэтому, естественно, для точного предварительного просмотра перетаскивания мне нужно указать размеры перетаскиваемого элемента. Для этого я передаю ширину и высоту элемента в источнике перетаскивания следующим образом:

 const [{isDragging,/*size*/}, dragRef, previewRef] = useDrag({
        item: {
            type: LIST_ITEM_DRAG_TYPE,
            item,
            size: {
                width: ref.current?.getBoundingClientRect().width,
                height: ref.current?.getBoundingClientRect().height
            }
        } as DraggedListItem,
        collect: monitor => ({
            isDragging: monitor.isDragging(),
            // size: (monitor.getItem() as DraggedListItem)?.size
        })
    })
  

Здесь ссылка — это a ReactRef для элемента html. Затем я извлекаю размеры следующим DragLayer образом:

 const {isDragging, currentOffset, item} = useDragLayer(monitor => ({
        currentOffset: monitor.getSourceClientOffset(),
        initialOffset: monitor.getInitialSourceClientOffset(),
        item: monitor.getItem(),
        isDragging: monitor.isDragging()
    }) as DragLayerProps)
  

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

Изначально я думал, что возникла проблема с ссылкой, что она не устанавливается после завершения перетаскивания и остается неопределенной. Но, похоже, это не так. После перетаскивания элемента в контейнер ref ему присваивается правильное значение.

Я думаю, что это как-то связано с React-DnD. Как вы можете видеть в useDrag хуке, я прокомментировал в collect функции возвращаемое значение надлежащего размера, где я просто извлекаю item из monitor , чтобы получить размер, так же, как я бы сделал в DragLayer . Если я раскомментирую это свойство, проблема, похоже, исчезнет. Я попытался назвать свойство по-другому (так что это не какое-то совпадение имен между тем, что находится внутри item , и тем, что внутри collect ), и это все еще работает. Я не могу понять, почему это работает, если это просто совпадение, что добавление этой строки кода решает проблему, а ошибка где-то в другом месте.

Кто-нибудь имеет представление о том, что здесь происходит? Заранее спасибо!

Комментарии:

1. Вы когда-нибудь решали эту проблему?