Библиотека Shopify Draggable предоставляет мощный
инструмент для реализации перетаскивания и перестановки элементов на
странице. Одной из её ключевых возможностей является
Swappable, позволяющий менять местами элементы в
контейнере с плавной анимацией. Для управления поведением после
изменения порядка используются события swappable:swapped и
swappable:stop, каждое из которых имеет своё предназначение
и структуру.
swappable:swappedОписание: Событие swappable:swapped
срабатывает после того, как два элемента успешно поменялись
местами. Оно предоставляет подробную информацию о перемещении и
позволяет выполнять дополнительные действия, такие как обновление данных
или синхронизация с сервером.
Структура события:
{
oldIndex: number, // исходный индекс элемента
newIndex: number, // новый индекс элемента после перестановки
dragEvent: DragEvent, // объект исходного события drag
dragEventData: Object, // дополнительные данные Draggable
dragged: HTMLElement, // элемент, который был перетащен
over: HTMLElement, // элемент, над которым произошло перемещение
container: HTMLElement // контейнер, содержащий элементы
}
Пример использования:
import { Swappable } from '@shopify/draggable';
const container = document.querySelector('.swappable-container');
const swappable = new Swappable(container, {
draggable: '.draggable-item'
});
container.addEventListener('swappable:swapped', (event) => {
const { oldIndex, newIndex, dragged, over } = event.detail;
console.log(`Элемент ${dragged.textContent} перемещён с позиции ${oldIndex} на ${newIndex}`);
console.log(`Элемент над которым перемещали: ${over.textContent}`);
});
Особенности:
swappable:stopОписание: Событие swappable:stop
вызывается в конце процесса перетаскивания, вне
зависимости от того, было ли фактическое изменение позиции элемента или
нет. Оно аналогично drag:stop в стандартном Draggable, но
применимо к Swappable.
Структура события:
{
dragEvent: DragEvent, // объект исходного события drag
dragged: HTMLElement, // элемент, который перетаскивали
over: HTMLElement, // элемент, над которым был drag
container: HTMLElement // контейнер, содержащий элементы
}
Пример использования:
container.addEventListener('swappable:stop', (event) => {
const { dragged, over } = event.detail;
if (over) {
console.log(`Элемент ${dragged.textContent} отпущен над ${over.textContent}`);
} else {
console.log(`Элемент ${dragged.textContent} отпущен вне зоны контейнера`);
}
});
Особенности:
| Событие | Когда срабатывает | Полезно для |
|---|---|---|
swappable:swapped |
После успешного обмена элементов | Обновление порядка данных, уведомления, аналитика |
swappable:stop |
После завершения drag в любом случае | Очистка состояния, анимации, восстановление классов |
Пример совместного использования:
container.addEventListener('swappable:swapped', (event) => {
console.log('Элементы поменялись местами:', event.detail);
});
container.addEventListener('swappable:stop', (event) => {
console.log('Завершено перетаскивание элемента:', event.detail.dragged.textContent);
});
В этом примере swappable:swapped фиксирует
фактические изменения порядка, а
swappable:stop позволяет выполнять действия в любом
случае, например, для визуальной очистки или сохранения
состояния интерфейса.
swappable:swapped.swappable:stop.swappable:stop, чтобы не вызывать лишних перерендеров.Эти события образуют ядро управления поведением
Swappable, обеспечивая гибкий контроль над процессом
перетаскивания и перестановки элементов. Правильное использование
swappable:swapped и swappable:stop позволяет
создавать плавные, отзывчивые интерфейсы с точной синхронизацией данных
и визуальных эффектов.