Библиотека Shopify Draggable предоставляет мощный
инструмент для реализации drag-and-drop интерфейсов в веб-приложениях.
Одним из ключевых аспектов является работа с
drop-зонами, которые обрабатывают события успешной или
отменённой передачи элемента. Два основных события, управляющих этим
процессом — droppable:dropped и
droppable:returned.
droppable:droppedСобытие droppable:dropped возникает в момент, когда
перетаскиваемый элемент успешно опущен в drop-зону,
которая соответствует заданным условиям. Оно позволяет получить
информацию о том, какой элемент был перенесён и куда именно он
попал.
Свойства события:
dragEvent.source — элемент, с которого был начат
перетаскиваемый объект.dragEvent.sensorEvent — объект сенсорного события,
который вызвал перетаскивание (MouseEvent или
TouchEvent).dragEvent.over — элемент drop-зоны, в которую был
помещён объект.dragEvent.originalSource — исходный элемент до любых
клонирований или изменений.Пример использования:
import { Droppable } from '@shopify/draggable';
const droppable = new Droppable(document.querySelectorAll('.drop-zone'), {
draggable: '.draggable-item'
});
droppable.on('droppable:dropped', (event) => {
console.log('Элемент был успешно помещён в drop-зону.');
console.log('Перетаскиваемый элемент:', event.dragEvent.source);
console.log('Drop-зона:', event.dragEvent.over);
});
Особенности:
Событие вызывается только при успешной проверке на допустимость drop-зоны, согласно настройкам Droppable.
Позволяет выполнять действия после перемещения, например:
droppable:returnedСобытие droppable:returned срабатывает, когда элемент
не был успешно перемещён в drop-зону и возвращается на
исходное место. Это критично для интерфейсов, где важно различать
успешное и неуспешное перетаскивание.
Свойства события:
dragEvent.source — перетаскиваемый элемент.dragEvent.sensorEvent — объект сенсорного события.dragEvent.over — null, так как элемент не
попал в drop-зону.dragEvent.originalSource — исходный элемент.Пример использования:
droppable.on('droppable:returned', (event) => {
console.log('Элемент вернулся на исходное место.');
console.log('Возврат элемента:', event.dragEvent.source);
});
Особенности:
droppable:dropped и droppable:returneddroppable:dropped, а при
неудачной — droppable:returned.Пример комплексной обработки:
droppable.on('droppable:dropped', handleDrop)
.on('droppable:returned', handleReturn);
function handleDrop(event) {
event.dragEvent.source.classList.add('dropped');
event.dragEvent.over.classList.add('has-item');
}
function handleReturn(event) {
event.dragEvent.source.classList.add('returned');
console.warn('Перемещение отменено, элемент вернулся на исходное место.');
}
Ключевые моменты для реализации интерфейсов:
droppable:dropped — для подтверждённых
действий.droppable:returned — для откатов и контроля
ошибок.Некоторые параметры Droppable напрямую определяют, когда срабатывают события:
accept — CSS-селектор, который определяет, какие
элементы можно помещать в drop-зону. Элементы, не соответствующие
селектору, вызывают droppable:returned.hoverClass — CSS-класс для drop-зоны при наведении
элемента.activeClass — класс, активируемый на drop-зоне во время
перетаскивания.Пример с фильтром:
const droppable = new Droppable(document.querySelectorAll('.drop-zone'), {
draggable: '.draggable-item',
accept: '.allowed-item'
});
В этом случае неразрешённые элементы автоматически
возвращаются, срабатывает событие
droppable:returned.
droppable:dropped), а запрещённые
перемещения возвращают карточку (droppable:returned).droppable:dropped для обновления состояния, а
попытка положить несуществующий элемент обратно —
droppable:returned.droppable:returned для отката позиции и анимации.Эти события образуют ядро обработки успешных и неуспешных операций перетаскивания в Shopify Draggable, обеспечивая точный контроль за пользовательскими действиями и позволяя создавать динамичные и предсказуемые интерфейсы.